从序列创建关系矩阵 (Matlab)

Create a relation matrix from a sequence (Matlab)

我有一个序列 S :

  S= 'ABCD' % which means A<B<C<D

我想将 S 转换为矩阵 M[i,j],它必须满足这些条件:

   M[i,j] , 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]

例如:如果我们有 S = 'ABCD',则 M 矩阵将如下所示:

      A      B    C    D
   A  o.5  0.25  0.2   0.1
   B  0.75 0.5   0.35  0.15
   C  0.8  0.65  0.5   0.4
   D  0.9  0.85  0.6   0.5

如何根据给定序列创建上述那种矩阵?

从你的问题看来你想要

  • 用在区间 (0,0.5) 上均匀分布的随机条目填充矩阵的下部(以便满足问题中的条件 4);
  • 然后根据条件3计算上半部分;
  • 对角线由条件2决定。

您可以按如下方式进行:

n = 4; %// size
M = NaN(n); %// preallocate
M(1:n+1:end) = 0.5; %// fill diagonal
ind_lower = tril(true(n), -1); %// logical index for lower part
M(ind_lower) = 0.5*rand(n*(n-1)/2, 1); %// fill lower part
M_aux = NaN(n); %// auxiliary variable to fill upper part
M_aux(ind_lower) = 1-M(ind_lower).';
M_aux = M_aux.';
M(ind_lower.') = M_aux(ind_lower.'); %// fill upper part

示例结果:

M =
    0.5000    0.5214    0.7573    0.5999
    0.4786    0.5000    0.9291    0.7891
    0.2427    0.0709    0.5000    0.5421
    0.4001    0.2109    0.4579    0.5000

这是另一种类似的方法:

n = 4;
M = tril(rand(n)*0.5, -1);
P = triu(1-M.', 1);
M = M + P + eye(n)*0.5;

结果:

M =

   0.500000   0.987433   0.711005   0.944642
   0.012567   0.500000   0.782633   0.902365
   0.288995   0.217367   0.500000   0.783708
   0.055358   0.097635   0.216292   0.500000