从给定的具有不同长度的字符串元胞数组创建矩阵

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

我在一个元胞数组中有 3 个序列:

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'

我想将 Input_cell 中的每个字符串转换为矩阵 M (i-by-j),它必须满足以下条件:

例如,如果我们有 S1 = 'ABCD'(这意味着 A<B<C<D),M1 矩阵将按如下所示:

     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

如果我们有S2 = 'ACD'(这意味着A<C<D),在'ABCD'的完整字符串中缺少B,我们将把值0.5在矩阵中 B 的每个位置,M2 矩阵预计如下:

     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  

如果我们有S3 = 'ABD'(这意味着A<B<D),在'ABCD'的完整字符串中缺少C,我们将把值0.5在矩阵中 C 的每个位置,M3 矩阵预期如下:

     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  

如何从给定的序列元胞数组创建上述那种矩阵?

首先,您需要了解如何仅针对单个序列执行此操作:

  1. 创建一个介于0.51之间的随机数矩阵:

    M = 0.5*rand(4) + 0.5;
    
  2. 设置主对角线等于0.5

    M(logical(eye(4))) = 0.5;
    
  3. M的上三角等于1-下三角:

    M(triu(true(4))) = 1 - M(tril(true(4)));   %// Note the main diagonal doesn't matter...
    
  4. 找出缺少的字母并相应地设置行和列等于0.5

    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;
    

现在您可以对一个矩阵执行此操作,只需遍历元胞数组或将其封装到一个函数中并使用 cellfun.