Effacer les filtres
Effacer les filtres

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

4 vues (au cours des 30 derniers jours)
Jiahong Zou
Jiahong Zou le 2 Juin 2023
Commenté : Jiahong Zou le 2 Juin 2023
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]

Réponse acceptée

Aman
Aman le 2 Juin 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 commentaire
Jiahong Zou
Jiahong Zou le 2 Juin 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?

Connectez-vous pour commenter.

Plus de réponses (1)

Jiahong Zou
Jiahong Zou le 2 Juin 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)

Catégories

En savoir plus sur Sparse Matrices dans Help Center et File Exchange

Produits


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by