Turn logical matrix into string vector
39 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Haris K.
am 17 Okt. 2020
Kommentiert: Yvan Lengwiler
am 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 Kommentare
Akzeptierte Antwort
Walter Roberson
am 1 Mai 2021
Bearbeitet: Walter Roberson
am 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)).').'
Weitere Antworten (3)
Bruno Luong
am 1 Mai 2021
Bearbeitet: Bruno Luong
am 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
am 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 Kommentare
Walter Roberson
am 9 Mai 2021
Seems over-complicated compared to
vec(idx*(1:size(idx,2)).').'
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!