从具有相同长度

时间:2015-10-12 12:27:29

标签: matlab matrix cell-array

这种情况与前一种情况的区别在于输入单元格相同的每个字符串的长度。之前的一个问题是长度不同,另一个案例只是从一个字符串转换为矩阵

我在细胞阵列中有3个序列:

Input_cell= {'ABCD','ACDB', 'BCAD'}

S1= 'ABCD'  % which means  A<B<C<D
S2= 'ACDB'  % which means A<C<D<B  
S3= 'BCAD'  % which means B<C<A<D  

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

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 = 'ACDB' (which means A<C<D<B), the M2 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.6   0.8
 C  0.8    0.4   0.5   0.1
 D  0.9    0.2   0.9   0.5 


% If we have S3 = 'BCAD' (which means B<C<A<D), the M3 matrix will be expected as follows:


     A      B     C     D
 A  0.5    0.6   0.7   0.1 
 B  0.4    0.5   0.2   0.3
 C  0.3    0.8   0.5   0.1
 D  0.9    0.7   0.9   0.5  

如何从给定的序列单元格数组创建上述矩阵?

1 个答案:

答案 0 :(得分:1)

我会做以下事情,即使它似乎没有真正优化:

1)填写输出矩阵,就像订单是自然的一样(即&#39; ABCD&#39;)。

2)对矩阵应用置换,使其满足您的条件。

Codewise:

1)

  • 在对角线上生成一个0.5的上对角线矩阵,并在对角线上方的[0,0.5]中对随机生成的值进行排序,例如:

A=diag([0.5 0.5 0.5 0.5])+sort(triu(0.5*rand(4),1),2);

输出示例:

A =

   0.500000000000000   0.084125649245764   0.108781654711410   0.277868971359693
                   0   0.500000000000000   0.092216833878827   0.125520923007868
                   0                   0   0.500000000000000   0.106015421266160
                   0                   0                   0   0.500000000000000
  • 填写较低的traingular块的值以匹配您的约束M(i,j)+M(j,i)=1

A=A+tril(1-transpose(A),-1);

输出:

A =

   0.500000000000000   0.084125649245764   0.108781654711410   0.277868971359693
   0.915874350754236   0.500000000000000   0.092216833878827   0.125520923007868
   0.891218345288590   0.907783166121173   0.500000000000000   0.106015421266160
   0.722131028640307   0.874479076992132   0.893984578733840   0.500000000000000

2)应用与输入序列排序相对应的排列。

注意:由于ASCII代码的定义方式,字符按字母顺序排序(例如参见'A'<'B''H'>'Z'的输出);

考虑到这一点,我们可以对您的输入序列进行排序,以便通过MATLAB的sort函数的第二个输出获得它所处的顺序。

[Tmp,order]=sort(input);

现在只需要计算你想要的输入矩阵:

A=A(order,order);

输出,案例input='ACDB'

A =

   0.500000000000000   0.277868971359693   0.084125649245764   0.108781654711410
   0.722131028640307   0.500000000000000   0.874479076992132   0.893984578733840
   0.915874350754236   0.125520923007868   0.500000000000000   0.092216833878827
   0.891218345288590   0.106015421266160   0.907783166121173   0.500000000000000

输出,案例input='BCAD'

A =

   0.500000000000000   0.891218345288590   0.907783166121173   0.106015421266160
   0.108781654711410   0.500000000000000   0.084125649245764   0.277868971359693
   0.092216833878827   0.915874350754236   0.500000000000000   0.125520923007868
   0.893984578733840   0.722131028640307   0.874479076992132   0.500000000000000
相关问题