我有两个矩阵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
我当前的实现速度足够快,虽然我更愿意避免不必要的循环,所以有没有办法在没有循环的情况下表达它?
答案 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
的每一行都有唯一值。