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

135 visualizzazioni (ultimi 30 giorni)
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

Risposta accettata

Matt J
Matt J il 19 Mar 2020
[~,result]=max(logical(A),[],1);
  3 Commenti
Benson Gou
Benson Gou il 19 Mar 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

Accedi per commentare.

Più risposte (3)

KSSV
KSSV il 18 Mar 2020
[val,id] = min(abs(A)) ;
Use the minimum function.
  1 Commento
Benson Gou
Benson Gou il 18 Mar 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

Accedi per commentare.


Les Beckham
Les Beckham il 18 Mar 2020
Modificato: Les Beckham il 18 Mar 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 Commento
Benson Gou
Benson Gou il 19 Mar 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

Accedi per commentare.


Matt J
Matt J il 19 Mar 2020

Categorie

Scopri di più su Genomics and Next Generation Sequencing in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by