set efficently specific rows in a sparse matrix to 0

6 visualizaciones (últimos 30 días)
Marko
Marko el 3 de Sept. de 2021
Comentada: Walter Roberson el 3 de Sept. de 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

Respuesta aceptada

Walter Roberson
Walter Roberson el 3 de Sept. de 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.

Más respuestas (1)

Marko
Marko el 3 de Sept. de 2021
here are the benchmark results:
ver Var2
___ _____
1 2.242
2 NaN
3 0.87
for version 2 i get the error:
Error using sub2ind (line 51)
The subscript vectors must all be of the same size.
Error in setBC (line 12)
J(sub2ind(size(L), vec(r), c)) = 0;
so your code snippet (version 3) saved me 61% or 1,3s every time i ran a computation.
Thank you very much
  1 comentario
Walter Roberson
Walter Roberson el 3 de Sept. de 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.

Iniciar sesión para comentar.

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by