Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
857 views
in Technique[技术] by (71.8m points)

matlab - Create matrices from a given cell-array of strings with different lengths

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) and M(j,i) are random
  • M(i,i) = 0.5
  • M(i,j) + M(j,i) = 1
  • M(i,j) < M(j,i) For example if A<B then M(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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Firstly you need to work out how to do this just for a single sequence:

  1. Create a matrix of random numbers between 0.5 and 1:

    M = 0.5*rand(4) + 0.5;
    
  2. Set the main diagonal to equal 0.5

    M(logical(eye(4))) = 0.5;
    
  3. 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...
    
  4. 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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...