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

流过昼夜 提交于 2019-12-18 07:23:32

问题


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?


回答1:


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.



来源:https://stackoverflow.com/questions/33011701/create-matrices-from-a-given-cell-array-of-strings-with-different-lengths

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!