Turn logical matrix into string vector
Show older comments
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
Accepted Answer
More Answers (3)
Haris K.
on 17 Oct 2020
Bruno Luong
on 1 May 2021
Edited: Bruno Luong
on 1 May 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
on 9 May 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 Comments
Walter Roberson
on 9 May 2021
Seems over-complicated compared to
vec(idx*(1:size(idx,2)).').'
Yvan Lengwiler
on 9 May 2021
True :-)
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!