哪些线的值不同于零 - matlab

Which lines have values different from zero - matlab

我有一个由 0 和 1 组成的矩阵。矩阵的任何给定列要么全为零,要么只有一个。

例如:

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];

有什么简单的方法可以得到这个吗?

矩阵乘法的可能解决方案:

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;

与其他方法的比较:

 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

结果:

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

您可以使用 max 的双输出版本,它给出了每个最大值的位置。对于仅包含零的列,最大值将位于第一行,因此您需要通过检查找到的最大值是 0 还是 1

来更正此问题
[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