matlabとベクトル化、FFから問題を始めたばかりです。
何をすべきか:
%n,t are vectors(1D arrays) EDIT: these are column vectors.
k=9;
i=1;
kv = 0.6*k:0.2*k:1.4*k;
[zs,zb] = size(k);
error1 = zeros(zs,1);
for k2 = kv
error1(i,1) = error_km(n,t,kv(i));
i= i+1;
end
ここで、error_kmは:(nとtは同じサイズです)
function [ returnV] = error_km( n,t,k )
returnV = 0
[a,b] = size(n);
Nt = zeros();
for i=2:a
Nt(i,1) = (n(i-1,1)^-1 + k*(t(i,1)-t(i-1,1)))^-1;
error1 = Nt(i,1) - n(i,1);
returnV = returnV + error1*error1;
end
プログラム全体には約3〜4分かかります。小さなテストケースでは、ループの単純なベクトル化された代替案を作成して理解することができましたが、このループをベクトル化する意味がありません。
何かガイダンスはありますか?
更新:error_kmで、今私は使用しています:
Nt = (n(1:a-1,1).^-1 + (diff(t(:,1))).*k).^-1 - n(2:a,1);
Nt = Nt.^2;
returnV = sum(Nt);
正常に動作しますが、それでもメインプログラムでは、kvを反復処理するためにループを使用する必要があります。kv(:)を使用すると、毎回単一の値ではなく関数にベクトルが渡されます。これをメインで使用しました: error1 = error_km(n,t,kv.*1);
メインループも取り除くことは可能ですか?
EDIT2、ソルン:
メインループを取り除くには、arrayfunを使用するだけです