Turn logical matrix into string vector

32 vues (au cours des 30 derniers jours)
Haris K.
Haris K. le 17 Oct 2020
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

Réponse acceptée

Walter Roberson
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])
idx = 5×3 logical array
0 1 0 0 0 1 1 0 0 1 0 0 0 1 0
vec = ["A","B","C"]
vec = 1×3 string array
"A" "B" "C"
vec(idx(:,1)*1 + idx(:,2)*2 + idx(:,3) * 3).'
ans = 5×1 string array
"B" "C" "A" "A" "B"
vec(idx*(1:size(idx,2)).').'
ans = 5×1 string array
"B" "C" "A" "A" "B"
  1 commentaire
Haris K.
Haris K. le 9 Mai 2021
Great, thank you!

Connectez-vous pour commenter.

Plus de réponses (3)

Haris K.
Haris K. le 17 Oct 2020
Btw, here is one solution:
arrayfun(@(i) vec(idx(i,:)),1:size(idx,1))'
But I was wondering if there is something that does not use any for-loop directly or indirectly.

Bruno Luong
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)
result = 1×5 string array
"B" "C" "A" "A" "B"
  1 commentaire
Haris K.
Haris K. le 9 Mai 2021
Thanks all for your effort!

Connectez-vous pour commenter.


Yvan Lengwiler
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
Walter Roberson le 9 Mai 2021
Seems over-complicated compared to
vec(idx*(1:size(idx,2)).').'
Yvan Lengwiler
Yvan Lengwiler le 9 Mai 2021
True :-)

Connectez-vous pour commenter.

Catégories

En savoir plus sur Data Type Identification dans Help Center et File Exchange

Produits


Version

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by