Turn logical matrix into string vector
33 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Haris K.
le 17 Oct 2020
Commenté : Yvan Lengwiler
le 9 Mai 2021
Hi. I have the logical matrix idx and the string array vec.
idx = logical([0 1 0; 0 0 1; 1 0 0; 1 0 0; 0 1 0])
vec = ["A","B","C"]
Each row of idx indicates which letter (from vec) should be assigned to that row.
The desired result is:
result = ["B";"C";"A";"A";"B"]
Is there a way to 'apply' matrix idx to a string matrix, or something like the following:
temp = repmat(vec, [size(idx,1), 1])
temp(idx) %This returns something but not as expected
0 commentaires
Réponse acceptée
Walter Roberson
le 1 Mai 2021
Modifié(e) : Walter Roberson
le 1 Mai 2021
idx = logical([0 1 0; 0 0 1; 1 0 0; 1 0 0; 0 1 0])
vec = ["A","B","C"]
vec(idx(:,1)*1 + idx(:,2)*2 + idx(:,3) * 3).'
vec(idx*(1:size(idx,2)).').'
Plus de réponses (3)
Bruno Luong
le 1 Mai 2021
Modifié(e) : Bruno Luong
le 1 Mai 2021
Assuming idx has one 1 per row
idx = logical([0 1 0; 0 0 1; 1 0 0; 1 0 0; 0 1 0]);
vec = ["A","B","C"];
[r,c]=find(idx);
result(r)=vec(c)
Yvan Lengwiler
le 9 Mai 2021
(I wrote my answer as a comment above. Sorry. Here it is as a formal answer.)
Of course, even if a solution does not appear to use a loop as seen in the Matlab program code, there will be a loop in the ultimapte machine code anyway. Not having a code in the Matlab program can improve legibility of the text for humans, but it is not obvious that it improves the speed of execusion.
Anyway, here is a solution:
idx = logical([0 1 0; 0 0 1; 1 0 0; 1 0 0; 0 1 0]);
vec = ["A","B","C"];
tempvec = repmat(vec', [size(idx',2), 1]);
tempidx = idx'; tempidx = tempidx(:);
result = tempvec(tempidx)'
2 commentaires
Walter Roberson
le 9 Mai 2021
Seems over-complicated compared to
vec(idx*(1:size(idx,2)).').'
Voir également
Catégories
En savoir plus sur Data Type Identification dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!