从元胞数组中的序列生成倒数矩阵 (Matlab)

Generate reciprocal matrices from sequences in the cell array ( Matlab )

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

   S= {'ABC','ACB','AB'}
   S{1}='ABC' means A<B<C and have the weights : A:3, B:2, C:1
   S{2}='ACB' means A<C<B and have the weights : A:3, C:2, B:1
   S{3}='AB' means A<B and have the weights : A:3, B:2

我想将 Input_cell 中的每个字符串转换为必须满足这些条件的矩阵 M[i,j] :

   M[i,i] =1
   M[i,j] = 1/M[j,i]
   If S{1}(i)<S{1}(j) then M[i,j]=weight(S{1}(i))/weight(S{1}(j))

例如: 在 S{1}= 'ABC' 中,权重将为 A:3、B:2、C:1

 If A<B then M[A,B]=3/2 and M[B,A]=2/3
 If B<C then M[B,C]=2/1 and M[C,B]=1/2 ....etc

因此 S{1} 的预期矩阵为:

       A     B    C
  A   [1    3/2  3
  B    2/3  1    2
  C    1/3  1/2  1]

在S{2}='ACB'中,ACB的权重为A:3、C:2、B:1。所以 S{2} 的预期矩阵将是:

       A   B   C  
  A   [1   3  3/2
  B   1/3 1  1/2
  C   2/3 2  1] 

在S{3}='AB'中,AB的权重为A:3、B:2、C:unknown。如果有未知值,我们将在矩阵中放入 1。如M[A,C]=M[C,A]=M[B,C]=M[C,B]=1。所以 S{3} 的预期矩阵将是: A B C A [1 3/2 1 乙 2/3 1 1 C 1 1 1] 如何输入字符串元胞数组并将它们转换为上述矩阵?

此任务有 2 个部分(针对元胞数组的每个元素): 1) 从字符串中获取数字。例如,ACB 序列被转换为 [3, 1, 2],因为第一列的强度为 3,第二列为 1,第三列为 2。 2) 从该数组创建矩阵。

1) 检查第一个字母,把3放在正确的位置。然后检查哪个是第二个,放2。第三个,放1。如果没有数字,放nan(= nan初始化数组)。如果你可以有任意多个字母,事情是一样的,只要先弄清楚你需要多大的数组。但是你的第三个案例将停止工作,因为它会假设你只有 2 个元素并将生成 2x2 矩阵。

第二部分是这样的:

seq=[3,1,2];
M = seq' * (1./seq);
M(isnan(M)) = 1; % all the numbers with nan become 1.

请注意,这将有双倍数 - M=1.5 和 0.3333,而不是分数(1/3、3/2)。要将其表示为分数,您通常需要做更多的工作。对于矩阵的每个元素,找到分母和分母的 gcd 并除以它。在这个包含 3 个元素的简单情况下,您只需将分母和分母放在对角线上为 1 的矩阵中 - 没有公约数。

denominator = repmat(seq, 3, 1);