哪些线的值不同于零 - 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
我有一个由 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