2016-11-06 16 views
1

我有一個零和一個矩陣。矩陣的任何給定的列都是滿零或者只有一個。哪些行的值不同於零 - matlab

例如爲:

A = [0 0 0 0 0; 
    1 0 0 0 0 
    0 0 0 0 0 
    0 0 1 0 0 
    0 0 0 0 1]; 

我想矢量B,讓我的每1線位置如果它應該給我的最大行數列1號。例如:

B = [2 5 4 5 5]; 

任何簡單的方法得到它?

回答

1

與矩陣乘法的一種可能的解決方案:

n = 9000; 
ro = randperm(n,4000); 
co = randperm(n , 4000); 
A = accumarray([ro(:) co(:)],1); 


disp('------matrix multiplication---------:') 
tic 
    [r ,~] = size(A); 
    B = (1:r) * A; 
    B(B==0)=r; 
toc 


disp('------find---------:') 

tic 
    [r,~]=find(A);   
    B = double(any(A)); 
    B(B==1)= r; B(B==0)=n; 
toc 

結果

A = [0 0 0 0 0; 
    1 0 0 0 0 
    0 0 0 0 0 
    0 0 1 0 0 
    0 0 0 0 1]; 
[r ,~] = size(A); 
B = (1:r) * A; 
B(B==0)=r; 

與其他方法相比

------matrix multiplication---------: 
Elapsed time is 0.0569789 seconds. 
------find---------: 
Elapsed time is 0.252345 seconds. 
0

可以使用的雙輸出版本max,它給出了這個positio每個最大值的n。對於只由零的最大將是第一行中的列,所以你需要通過檢查來糾正這一點,如果找到的最大值爲01

[m, result] = max(A, [], 1); % maximum of each column, and its row index 
result(~m) = size(A, 1); % if the maximum was 0: modify result