Arrange string based on 1 or 0 value

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.

 Accepted Answer

Stephen23
Stephen23 on 4 Jul 2017
Edited: Stephen23 on 4 Jul 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 Comments

fun = @(v) {strjoin(D(v), ', ')};
would be a lot simpler since you then don't need the cellfun to remove that leading ', ' inserted by sprintf:
[col,row] = find(F');
fun = @(v) {strjoin(D(v), ', ')};
out = accumarray(row,col,[],fun);
out(cellfun('isempty',out)) = {'-'};
Stephen23
Stephen23 on 4 Jul 2017
Edited: Stephen23 on 4 Jul 2017
@Guillaume: agreed... but sadly not on the MATLAB version I have.
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

Sign in to comment.

More Answers (1)

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 Comments

Jan
Jan on 4 Jul 2017
Edited: Jan on 4 Jul 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.
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?

Sign in to comment.

Categories

Asked:

on 4 Jul 2017

Edited:

on 4 Jul 2017

Community Treasure Hunt

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

Start Hunting!