set efficently specific rows in a sparse matrix to 0
10 次查看(过去 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
0 个评论
采纳的回答
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.
0 个评论
更多回答(1 个)
Marko
2021-9-3
1 个评论
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 Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!