0

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を使用するだけです

4

2 に答える 2

1

ここにあなたが求める答えのいくつかの部分があります。残りはあなたが理解できると信じています。次の式を置き換えることができます。

t(i,1)-t(i-1,1)

(ベクトル化された)式で

diff(t(:,1))

iその後、ループ オーバーを次の式に置き換えることができます。

Nt(a:-1:2,1) = (n(a-1:-1:1),1)^-1 + k*(diff(t(:,1))))^-1;
returnV = dot(Nt(:,1)-n(:,1),Nt(:,1)-n(:,1));

私があなたのコードを正しく読み、ブラケットを適切に一致させた場合、あなたの好みに合わせて十分にベクトル化されている可能性があります。

そして、すでにアドバイスされているように、 を preallocate する必要があります。Ntこの場合、次のように記述します。

Nt = zeros(size(n))
于 2012-04-12T08:51:02.273 に答える
1

error_kmを事前に割り当てないでくださいNt。このステップは重要です。理由については、この Matlab ヘルプファイルで詳しく知ることができます。

のサイズがわかっている場合はNt、zeros() の呼び出しで設定できます。それ以外の場合は、ループを再構築できます。

function [ returnV] = error_km( n,t,k )
returnV = 0
    [a,b] = size(n);
    Nt = zeros();
    for i=a:-1:2
        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
于 2012-04-11T23:01:35.363 に答える