set efficently specific rows in a sparse matrix to 0

8 次查看(过去 30 天)
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

采纳的回答

Walter Roberson
Walter Roberson 2021-9-3
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.

更多回答(1 个)

Marko
Marko 2021-9-3
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 个评论
Walter Roberson
Walter Roberson 2021-9-3
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.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Sparse Matrices 的更多信息

产品


版本

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by