在不使用循环的情况下从矩阵中选择条目

时间:2012-06-27 16:50:01

标签: matlab matrix indexing

我有两个矩阵AB,这两个矩阵都是Nx3矩阵。

我目前正在使用以下方法获取矩阵A每行的最大值和索引:

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

idx(j)表示哪个列包含行j的最大值。现在我想从矩阵B中选择那些相同的位置。

我目前使用循环实现了这个:

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

我当前的实现速度足够快,虽然我更愿意避免不必要的循环,所以有没有办法在没有循环的情况下表达它?

3 个答案:

答案 0 :(得分:2)

你可以构建一个线性索引向量(我希望B与A的大小相同):

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

然后您可以直接使用该向量进行查找:

maxB = B(vec_indices)

答案 1 :(得分:2)

您可以将单维索引构建到矩阵中并以此方式获取它们。可以解决matlab中的所有多维矩阵。

您可以使用

maxB = B(sub2ind([1:length(idx)]',idx(:)));

答案 2 :(得分:0)

在一行中:

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

但这不安全。它假设A的每一行都有唯一值。