For
A=[1;3;5]
and
B=cell(7,1)
I have the following results stored in a cell
[1]
[3]
[5]
[1;3]
[1;5]
[3;5]
[1;3;5]
I would like to print
the results in a way that a=1
, b=3
, and c=5
. -- Basically assign each value in A to a variable.
How would I do this in Matlab ?
I am looking for a result which can be something like this :
" you can have a "
" you can have b "
" you can have c "
" you can have a or b "
.
.
etc
Let C
be the array of letters you want to assign to the numbers in A
. Then
A = [1 3 5];
B = {[1]; [3]; [5]; [1;3]; [1;5]; [3;5]; [1;3;5]};
C = ['a', 'b', 'c']
k = 6; % indicates current line of B
str = ['you can have ' strrep(strrep(sprintf('_%c_', ...
C(ismember(A, B{k}))'), '__', ' or '), '_', '')];
results in
str =
you can have a or b or c
If you want to create the responses to all fields in B
at once, you can use
allStr = arrayfun(@(x) ['you can have ' strrep(strrep(sprintf('_%c_', ...
C(ismember(A, B{x}))'), '__', ' or '), '_', '')], ...
(1:length(B))', 'uniformoutput', false)
This results in
allStr =
'you can have a'
'you can have b'
'you can have c'
'you can have a or b'
'you can have a or c'
'you can have b or c'
'you can have a or b or c'
A step by step explanation of this code is as follows:
% which contents of A can be found in B?
idx = ismember(A, B{k})';
% to which letters do these indices correspond?
letters = C(idx);
% group the letters in a string embedded in '_' as place holders for later use
% by this, the places between letters will be marked with '__' and the places
% at the beginning and the end of the string will be marked with '_'
stringRaw = sprintf('_%c_', letters);
% replace each occurrence of '__' by ' or '
stringOr = strrep(stringRaw, '__', ' or ');
% replace each occurrence of '_' by ''
stringClean = strrep(stringOr, '_', '');
% add first half of sentence
stringComplete = ['you can have ' stringClean];
To get this working with complete words (as requested in the comments), you need to transform C
into a cell array of strings and update the formula accordingly:
A = [1 3 5];
B = {[1]; [3]; [5]; [1;3]; [1;5]; [3;5]; [1;3;5]};
C = {'first', 'second', 'third'}
k = 7; % indicates current line of B
str = ['you can have ' strrep(strrep(sprintf('_%s_', ...
C{ismember(A, B{k})}), '__', ' or '), '_', '')];
This results in:
str =
you can have first or second or third