2012-06-27 64 views
1

我有兩個矩陣AB,這兩個矩陣都是Nx3矩陣。從矩陣中選擇條目而不使用循環

我目前獲得的最大值和索引使用矩陣A的每一行:

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

idx(j)表示哪一列載有j行的最大值。現在,我想選擇矩陣B.

我使用一個循環目前實施這種那些相同的位置:

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

我目前的實現是速度不夠快,但我更喜歡以避免不必要的循環使有沒有一種方法來表達這個沒有循環?

回答

2

你可以建立線性索引的矢量(我希望B到是相同的尺寸A):

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

然後你就可以直接使用向量查找:

maxB = B(vec_indices) 
2

你可以將單維度索引構建到矩陣中並以此方式得到它們。 matlab中的所有多維矩陣都可以解決。

您可以使用

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

在一個行:

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

但是,這是不是安全。它假設在A的每一行都有唯一的值。