Arrange string based on 1 or 0 value

6 vues (au cours des 30 derniers jours)
yue ishida
yue ishida le 4 Juil 2017
Modifié(e) : Guillaume le 4 Juil 2017
Hi. I have question regarding to cell string and matrix. I have matrix F and cell string D. I want to create another cell string Y.
F =
0 0 0 0
1 0 0 1
0 1 1 1
1 1 1 1
D =
'A'
'B'
'C'
'D'
Therefore, I want to create Y with output like this.
Y =
'-'
'A, D'
'B, C, D'
'A, B, C, D'
The steps are:
-1- recognize column positions of value 1 for row 1 in F.
-2- the column positions are equal to row positions of D. So, string in that row positions will input to row 1 of Y.
-3- do the same step for next row in F and D. If no value 1 for that row, that row position of Y will be empty, and maybe can be replace with sign - as to indicate no string available from D.

Réponse acceptée

Stephen23
Stephen23 le 4 Juil 2017
Modifié(e) : Stephen23 le 4 Juil 2017
[col,row] = find(F');
fun = @(v){sprintf(', %s',D{v})};
out = accumarray(row,col,[],fun);
out = cellfun(@(s)s(3:end),out,'uni',0)
out(cellfun('isempty',out)) = {'-'};
giving:
>> out{:}
ans = -
ans = A, D
ans = B, C, D
ans = A, B, C, D
  3 commentaires
Stephen23
Stephen23 le 4 Juil 2017
Modifié(e) : Stephen23 le 4 Juil 2017
@Guillaume: agreed... but sadly not on the MATLAB version I have.
Guillaume
Guillaume le 4 Juil 2017
Modifié(e) : Guillaume le 4 Juil 2017
It's trivial to implement:
function s = strjoin(strings, joint)
join = cell(2, numel(strings));
join(1, :) = strings(:);
join(2, 1:end - 1) = {joint};
s = [join{:}];
end

Connectez-vous pour commenter.

Plus de réponses (1)

KSSV
KSSV le 4 Juil 2017
F =[0 0 0 0
1 0 0 1
0 1 1 1
1 1 1 1] ;
D = {'A' 'B' 'C' 'D'} ;
F = logical(F) ;
for i = 1:4
iwant = D(F(i,:))
end
  2 commentaires
Jan
Jan le 4 Juil 2017
Modifié(e) : Jan le 4 Juil 2017
Note: Changing the type of a variable can degrade the processing speed, because the JIT acceleration is impeded. Something like LF=logical(F) is a very cheap way to increase the speed.
yue ishida
yue ishida le 4 Juil 2017
The final iwant is not similar with Y. The output is like this
iwant =
Empty cell array: 1-by-0
iwant =
'A' 'D'
iwant =
'B' 'C' 'D'
iwant =
'A' 'B' 'C' 'D'
so final is ABCD in one row, not 4 rows, unlike Y. Can you help me find the right one?

Connectez-vous pour commenter.

Catégories

En savoir plus sur Characters and Strings 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!

Translated by