1

私は2つの行列Aとを持っています。BどちらもNx3行列です。

現在、以下を使用して、行列Aの各行の最大値とインデックスを取得しています。

[maxA, idx] = max(A, [], 2)

idx(j)行の最大値が含まれている列を示しますj。ここで、行列Bから同じ位置を選択したいと思います。

私は現在、ループを使用してこれを実装しています:

for j = 1:numel(idx)
   maxB(j) = B(j, idx(j))
end

私の現在の実装は十分に高速ですが、不要なループを避けたいので、ループなしでこれを表現する方法はありますか?

4

3 に答える 3

2

線形インデックスのベクトルを作成できます(BはAと同じサイズであると思います)。

vec_indices = sub2ind(size(A), 1:numel(idx), idx);

次に、そのベクトルをルックアップに直接使用できます。

maxB = B(vec_indices)
于 2012-06-27T16:57:47.370 に答える
2

単一次元のインデックスをマトリックスに構築し、その方法で取得できます。matlabのすべての多次元行列に対応できます。

使用できます

maxB = B(sub2ind([1:length(idx)]',idx(:)));
于 2012-06-27T16:59:42.970 に答える
0

一行で:

maxB = B(A == max(A, [], 2) * ones(1, 3));

しかし、これは安全ではありません。のすべての行で一意の値を想定していますA

于 2012-06-27T21:17:01.037 に答える