Clear Filters
Clear Filters

How can i find out all indices of nonzero elements in a sets of matrices?

3 views (last 30 days)
I have 19 sparse matrices which are 30000 * 30000 big. Each matrix is slightly different from another. How can i use [row, col] = find() function to get row and col vectors, which contain all position of nonzero element?
For example, A = [1 0; 0 0], B = [ 0 1; 0 0], C = [ 0 0 ; 1 0], D = [ 0 1; 1 0]
row = [ 1 1 2], col = [1 2 1]

Accepted Answer

Aman
Aman on 2 Jun 2023
Hi Jiahong,
Assuming that you want to have unique pairs of row and column, the following code should work:
% Create a cell array of example sparse matrices
A = sparse([1 0; 0 0]);
B = sparse([0 1; 0 0]);
C = sparse([0 0; 1 0]);
D = sparse([0 1; 1 0]);
matrices = {A, B, C, D};
% Initialize empty row and column vectors
row = [];
col = [];
% Loop over each matrix in the cell array
for i = 1:numel(matrices)
% Use find to get the row and column indices of all nonzero elements
[r, c, ~] = find(matrices{i});
% Append the row and column indices to the overall row and column vectors
row = [row; r];
col = [col; c];
end
% Remove duplicate pairs from row and col
[row_col, idx] = unique([row, col], 'rows');
row = row_col(:,1);
col = row_col(:,2);
% Display the row and column vectors
row
col
If you want all pairs of row and column, use the following code:
% Create a cell array of example sparse matrices
A = sparse([1 0; 0 0]);
B = sparse([0 1; 0 0]);
C = sparse([0 0; 1 0]);
D = sparse([0 1; 1 0]);
matrices = {A, B, C, D};
% Initialize empty row and column vectors
row = [];
col = [];
% Loop over each matrix in the cell array
for i = 1:numel(matrices)
% Use find to get the row and column indices of all nonzero elements
[r, c, ~] = find(matrices{i});
% Append the row and column indices to the overall row and column vectors
row = [row; r];
col = [col; c];
end
% Display the row and column vectors
row
col
Hope this helps!
  1 Comment
Jiahong Zou
Jiahong Zou on 2 Jun 2023
Hi Aman, thx for the answer. There are actually about 180000 nonzero elements in each matrix. I'm afraid it will run out of memory before removing duplicate pairs. Is there a more memory-saving way?

Sign in to comment.

More Answers (1)

Jiahong Zou
Jiahong Zou on 2 Jun 2023
Well this would work but is there a way not to repeat 19 times for 19 matrices?
[row, col] = find(A ~= 0 | B ~= 0 | C ~= 0 | D ~= 0)

Categories

Find more on Sparse Matrices in Help Center and File Exchange

Products


Release

R2022b

Community Treasure Hunt

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

Start Hunting!