Arrange string based on 1 or 0 value

2 views (last 30 days)
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
Stephen23
Stephen23 on 4 Jul 2017
Edited: Stephen23 on 4 Jul 2017
@Guillaume: agreed... but sadly not on the MATLAB version I have.
Guillaume
Guillaume on 4 Jul 2017
Edited: Guillaume on 4 Jul 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

Sign in to comment.

More Answers (1)

KSSV
KSSV on 4 Jul 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 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.
yue ishida
yue ishida on 4 Jul 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?

Sign in to comment.

Categories

Find more on Just for fun 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!