1

何度も繰り返されるコードに 2 つの for ループが埋め込まれています。私は物事をスピードアップしたい:

for i = 1:10
 for j = 1:10
  A(i,j) = B(i,j,D(i,j))*C(i,j); 
 end 
end 

ここで、D は B のインデックスである整数で構成されます。D に依存しない場合、for ループは要素単位の行列乗算に置き換えることができます。問題は、B をエレガントな方法で評価する方法です。SO と mathworks-pages を検索し、線形索引付けを試みましたが、これによりエラーが発生します。

d = reshape(D, 100, []);
b = reshape(B, 100, []);
arrayfun(@(x) b(x,d(x)), 1:100);

私は何を間違っていますか?2 つの for ループを置き換える方法はありますか?

4

2 に答える 2

1

D線形インデックスに変換できます。

[rows,cols]=ndgrid(1:10,1:10);
idx = sub2ind(size(B),rows(:),cols(:),D(:));

A = zeros(10,10); %# initialize A to the right size
A(:) = B(idx).*C(:);
于 2013-05-08T20:03:20.133 に答える
0

のインデックスで順序付けされたBレイヤーに対して要素ごとの乗算を使用できます(最初に行に沿ってループし、次に列に沿ってループしていることに注意してください。つまり、行の最後に右に移動し、次に次の行などに移動します...これが、転置して列に再形成する理由です)。ADD

簡単な方法は、次を使用することbsxfun()です。

out = bsxfun(@times, A(:,:,reshape(D',[],1)), B);

out の各層は次のとおりです。

out(:,:,1)   = A(:,:,D(1,1)).*B(:,:)
out(:,:,2)   = A(:,:,D(1,2)).*B(:,:)
...
out(:,:,ncols*(i-1) + j) = A(:,:,D(i,j)).*B(:,:)

これがあなたが望んでいたものではない場合、私の悪いことです。回答を削除します。

于 2013-05-08T17:38:11.990 に答える