Find the indices of one variable in another one avoiding NaNs

3 vues (au cours des 30 derniers jours)
Daria Ivanchenko
Daria Ivanchenko le 3 Nov 2020
Hi!
I have two matrices, A and B, they have the same number of rows and different number of columns. Matrix A is just some numbers, matrix B is the indices. Both matrices have different amout of NaNs in the end.
I want to find the number in matrix A that matches the index in the matrix B (using the simple C = B(A)). But it doesn't work with NaNs inside the matrices. Is there some other way to do it?
A = [1 2 3 7 8; 1 5 3 NaN NaN; 1 9 3 6 NaN];
B = [2 4 5 NaN; 1 2 3 NaN NaN; 1 2 NaN NaN NaN];
C = B(A);
C = [2 7 8; 1 5 3; 1 9];
Thanks!
  4 commentaires
Daria Ivanchenko
Daria Ivanchenko le 3 Nov 2020
Regarding the sample, this one is correct:
A = [1 2 3 7 8; 1 5 3 NaN NaN; 1 9 3 6 NaN];
B = [2 4 5 NaN NaN; 1 2 3 NaN NaN; 1 2 NaN NaN NaN];
C = B(A);
C = [2 7 8; 1 5 3; 1 9];
Yeah, I missed one NaN, sorry.
Stephen23
Stephen23 le 3 Nov 2020
Modifié(e) : Stephen23 le 3 Nov 2020
This is not a valid matrix, because the rows have different numbers of elements:
C = [2 7 8; 1 5 3; 1 9]; % NOT VALID

Connectez-vous pour commenter.

Réponse acceptée

Stephen23
Stephen23 le 3 Nov 2020
Modifié(e) : Stephen23 le 3 Nov 2020
The C you showed in your example is not possible as it has different numbers of elements in each row, but you could put the data into a cell array:
>> A = [1 2 3 7 8; 1 5 3 NaN NaN; 1 9 3 6 NaN]
A =
1 2 3 7 8
1 5 3 NaN NaN
1 9 3 6 NaN
>> B = [2 4 5 NaN NaN; 1 2 3 NaN NaN; 1 2 NaN NaN NaN]
B =
2 4 5 NaN NaN
1 2 3 NaN NaN
1 2 NaN NaN NaN
>> idx = ~isnan(B);
>> [idr,~] = find(idx);
>> idc = B(idx);
>> idy = sub2ind(size(A),idr,idc);
>> C = accumarray(idr,A(idy),[],@(v){v});
>> C{:}
ans =
2
7
8
ans =
1
5
3
ans =
1
9

Plus de réponses (0)

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by