1

{1,...,n} の値を持つ大きな配列 A と、同じサイズの別の配列 B があります。

私は次のすべてを取得したい:

B(A==1)
B(A==2)
...
B(A==n)

そして、その結果に対して別のことを行います (今のところそれほど重要ではありません)。

私は次のようなことを試しました:

[x,y] = B(A==[1:n])

[x,y] = [B(A==1), B(A==2), ..., B(A==n)]

もちろん駄目。

for ループのアプローチ

for ii=1:n
    dummy=B(A==1)
    other stuff
end

動作しますが、MATLAB ではすべての for ループを回避できると確信しています! しかし、ここで立ち往生。助言がありますか?おそらく、ある種のインライン匿名関数呼び出しでしょうか?

4

2 に答える 2

2

arrayfunこのようなことのあなたの友達です。うまくいけば、あなた自身の使用のためにこれを変更する方法を見ることができます:

A=randi(5,10,10)
B=rand(10)
C=arrayfun(@(i) B(A==i),1:5,'UniformOutput',false)
C{1} % for example, gives B(A==1)

Cセル配列です。

for大規模な問題では、ループが高速になる可能性があることに注意してください。arrayfunが実際に速いかどうかを確認するために、いくつかのテストを行うことをお勧めします。この質問とその回答を見て、これについてもう少し学びましょう。を使わずにこれを行う方法があるかもしれませarrayfunんが、思いつきません!

于 2014-05-21T02:46:53.490 に答える
1

Aベクトル配列であると仮定すると、A の各要素を [1:n] のベクトルと比較するバイナリ行列を作成できます。ここで、n は A の最大要素です -

indx_mat = bsxfun(@eq,A,1:max(A))

次に、比較に基づいて B のいくつかの要素にアクセスする必要があるときはいつでも、indx_mat代わりに特定の列を使用できます。たとえば、 の要素にアクセスする必要がある場合はB(A==2)、 を使用しますB(indx_mat(:,2))

于 2014-05-21T06:55:04.850 に答える