set efficently specific rows in a sparse matrix to 0
7 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Marko
il 3 Set 2021
Commentato: Walter Roberson
il 3 Set 2021
Hello comunity,
I have a sparse matrix J and i want to set specific rows to 0.
My code's like this:
J = sparse(blkdiag(rand(1000,1000),rand(100,100),rand(200,200))); % just for example
vec = [1:10,20:400,800:1100]'; % just for example
J(vec,:) = 0;
Is there a faster way how to set the specific lines of J to 0?
best regards,
Marko
0 Commenti
Risposta accettata
Walter Roberson
il 3 Set 2021
Would it be practical in your situation to transpose the matrix, so that you were setting columns to 0 instead of rows? With the implementation of sparse(), it is more efficient to change multiple items in one column.
Beyond that: the usual efficiency hint is to find() the non-zero objects of interest, and then use those indices to assign new values.
It would be interesting to benchmark,
J(vec,:) = 0;
compared to
[r,c] = find(J(vec,:));
J(sub2ind(size(J), vec(r), c)) = 0;
compared to
[r,c,s] = find(J(vec,:));
J = J - sparse(vec(r), c, s, size(J,1), size(J,2));
The third of those is locating the non-zero elements of those rows of J, along with the values there, and building a new sparse array that contains only those elements, and then subtracts the two.
0 Commenti
Più risposte (1)
Marko
il 3 Set 2021
1 Commento
Walter Roberson
il 3 Set 2021
In your posted question, vec is a column vector. And the code I posted works when vec is a column vector. But if vec were a row vector instead then you would get the error you mention.
Vedere anche
Categorie
Scopri di più su Sparse Matrices 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!