2013-12-09 107 views
3

我想在MATLAB中創建一個類矩陣,而不使用for循環。所以,我有A創建沒有for循環的類矩陣

A = [ 1 2 3 4; 
     2 5 4 1; 
     7 2 3 4]; 

現在我想創建一個類矩陣,所以我想尋找每一列和任何的最高值位置將成爲「1」。因此,使用A,我想B看起來像這樣:

B = [ 0 0 0 1; 
     0 1 0 0; 
     1 0 0 0]; 

我一直在嘗試使用下面的代碼來創建B矩陣,然後搜索使用下面的代碼中的每一列的最大值:

[rows_A columns_A] = size(A); 
B = zeros(rows_A, columns_A); 
max(A, [], 2); 

然後我試圖使用ind2sub得到內A的位置,這樣我就可以把一個「1」在B矩陣。這種方法沒有解決。矩陣A可以是任何尺寸。任何幫助是極大的讚賞。

回答

1

您可以使用maxsub2ind到標誌和最大值的列的每一行如下:

[~,indMaxCol] = max(A,[],2); 
B = zeros(size(A)); 
B(sub2ind(size(B),1:size(B,1),indMaxCol.')) = 1 %' flag largest column, each row 
B = 
    0  0  0  1 
    0  1  0  0 
    1  0  0  0 

另一種解決方案,它不需要sub2ind是創建一個sparse矩陣:

Bs = sparse(1:size(B,1),indMaxCol,1) 
Bs = 
    (3,1)  1 
    (2,2)  1 
    (1,4)  1 

這可以轉換爲full matrixfull(Bs)

1

bsxfun單行溶液(計算最大的每一行,然後比較是否相等):

bsxfun(@eq, A, max(A,[],2)) 

這不同於@ chappjc在一個方面中的解決方案:如果最大達到多於一次在更一些行,這給所有列達到最大值。例如:

>> A = [ 4  2  3  4 
     2  5  4  1 
     7  2  3  4 ]; 

>> bsxfun(@eq, A, max(A,[],2)) 

ans = 

    1  0  0  1 
    0  1  0  0 
    1  0  0  0 
+0

...如果你想在每行中_only的first_最大,你可以使用以下(仍然一行,固然不是很清楚但嘿): 'DIFF([零(大小(A,1),1)邏輯(cumsum(bsxfun(@eq,A,max(A,[],2)),2))],[],2)' –