How to quickly find the first non-zero element without iterations in all columns in a sparse matrix?

120 visualizaciones (últimos 30 días)
Hi, All,
I have a big sparse matrix A. I want to find out the first non-zero element in all columns from the top. Here is my code:
reorderCol = [];
for jCol = 1 : length(A(1,:))
eee = find(A(:,jCol),1,'first');
reorderCol = [reorderCol eee];
end
For example, I have matrix A = [0 0 0;0 5 0;0 0 1;0 0 0;-1 0 -4]. My code gives the following result:
reorderCol = [5 2 3];
I am wondering if it is possible to obtain reorderCol without iterations. Thanks a lot.
Benson

Respuesta aceptada

Matt J
Matt J el 19 de Mzo. de 2020
[~,result]=max(logical(A),[],1);
  3 comentarios
Benson Gou
Benson Gou el 19 de Mzo. de 2020
Hi, Matt,
Do you think I can use your code to do the same thing for the rows in a sparse matrix? I want to find the index of the LAST non-zero element in each row in A.
For example, I have matrix A = [2 0 0;0 5 0;0 0 1;0 3 0;-1 0 -4]. My code gives the following result:
reorderRow = [1 2 3 2 3];
Thanks a lot.
Benson

Iniciar sesión para comentar.

Más respuestas (3)

KSSV
KSSV el 18 de Mzo. de 2020
[val,id] = min(abs(A)) ;
Use the minimum function.
  1 comentario
Benson Gou
Benson Gou el 18 de Mzo. de 2020
Hi, KSSV, thanks for your reply. I am sorry for the unclarity of my statement. I am looking for the position of the first non-zero element in each column, not the value of the first non-zero element. Thanks!
Benson

Iniciar sesión para comentar.


Les Beckham
Les Beckham el 18 de Mzo. de 2020
Editada: Les Beckham el 18 de Mzo. de 2020
Try this. In my test with a 1000x1000 random sparse 0 or 1 matrix (A = sparse(randi([0 1], 1000, 1000));) it is about 4 times faster.
i = find(A(:) ~= 0, 1, 'first');
ij = ind2sub(size(A), i);
For a 5000x5000 A it is actually slower, however (about 83% as fast).
Note that I am using Octave as I don't currently have access to Matlab.
Iteration is not always necessary, or desirable, to avoid. In fact, many of the Matlab 'tricks' are just iteration in disguise.
I hope this helps.
Perhaps your results will be different using Matlab vs. Octave. Let me know.
  1 comentario
Benson Gou
Benson Gou el 19 de Mzo. de 2020
Hi, Les,
I tried your code. I found it only gives me one integer which is the first non-zero lement in the first column in A. How can I apply for all the columns in A? Thanks.
Benson

Iniciar sesión para comentar.


Matt J
Matt J el 19 de Mzo. de 2020

Categorías

Más información sobre Genomics and Next Generation Sequencing en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by