I have 3 sequences in a cell-array:
Input_cell= {'ABCD','ACD', 'ABD'}
S1= 'ABCD' % which means A<B<C<D
S2= 'ACD' % which means A<C<D % missing B in the full string of 'ABCD'
S3= 'ABD' % which means A<B<D % missing C in the full string of 'ABCD'
I want to convert each of the strings in the Input_cell
into a matrix M
(i
-by-j
) which has to satisfy these conditions:
M(i,j)
andM(j,i)
are randomM(i,i) = 0.5
M(i,j) + M(j,i) = 1
M(i,j) < M(j,i)
For example ifA<B
thenM(A,B) < M(B,A)
For example if we have S1 = 'ABCD'
(which means A<B<C<D
), the M1
matrix will be expected as follows:
A B C D
A 0.5 0.3 0.2 0.1
B 0.7 0.5 0 0.4
C 0.8 1 0.5 0.1
D 0.9 0.6 0.9 0.5
If we have S2 = 'ACD'
(which means A<C<D
), missing B
in the full string of 'ABCD'
, we will put the value 0.5
in every position of B
in the matrix, the M2
matrix will be expected as follows:
A B C D
A 0.5 0.5 0.2 0.1
B 0.5 0.5 0.5 0.5
C 0.8 0.5 0.5 0.1
D 0.9 0.5 0.9 0.5
If we have S3 = 'ABD'
(which means A<B<D
), missing C
in the full string of 'ABCD'
, we will put the value 0.5
in every position of C
in the matrix, the M3
matrix will be expected as follows:
A B C D
A 0.5 0.4 0.5 0.1
B 0.6 0.5 0.5 0.3
C 0.5 0.5 0.5 0.5
D 0.9 0.7 0.5 0.5
How to create that kind of above matrices from a given cell-array of sequences?
Firstly you need to work out how to do this just for a single sequence:
Create a matrix of random numbers between
0.5
and1
:M = 0.5*rand(4) + 0.5;
Set the main diagonal to equal
0.5
M(logical(eye(4))) = 0.5;
Set the upper triangle of
M
equal to 1 - the lower triangle:M(triu(true(4))) = 1 - M(tril(true(4))); %// Note the main diagonal doesn't matter...
Work out which letter is missing and set the row and column equal to
0.5
accordingly:fullSeq = 'abcd'; idx = find(fullSeq == setdiff(fullSeq, 'abd')); %// at this point you'll need to check if idx is empty first... M(:,idx) = 0.5; M(idx,:) = 0.5;
And now that you can do it for one matrix, just loop over your cell array or else encapsulate this into a function and use cellfun
.
来源:https://stackoverflow.com/questions/33011701/create-matrices-from-a-given-cell-array-of-strings-with-different-lengths