好吧,代码并不完全正确。第三项包括一个K,这在论文中给出的公式中没有。此外,最后一项不会与 e eT 相乘。但是,在这种情况下可以省略后者,因为 MATLAB 会自动将标量添加到矩阵中的所有元素。这同样适用于第三项,因此也可以在此处省略。
以下是上述简化的正确版本:
K = K - (1/p)*(K*ones(p,1))*ones(1,p) - 1/p + (1/p^2)*sum(sum(K))
我们可以通过只调用一次ones 来进一步简化,因为ones(p,1)*ones(1,p) 为您提供与ones(p) 相同的结果。此外,sum(sum(K)) 可以替换为sum(K(:))。
它看起来像这样:
K = K - (1/p)*K*ones(p) - 1/p + (1/p^2)*sum(K(:))
现在我们可以将其与公式的一对一实现进行比较。因此,我们将使用e = ones(p,1) 来表示e。要获得 eT,您只需将 e 转置为 .'。所以公式可以写成:
K = K - (1/p)*K*e*e.' - (1/p)*e*e.' + ((e.'*K*e)/p^2)*e*e.'
注意e.'*K*e只是计算K中所有元素的总和,等于sum(K(:))。这是有效的,因为e = ones(p,1)。
让我们生成一些样本数据并比较结果:
rng(8); % make it reproducible
p = 3; % size of matrix
K = randi(10,p); % generate random matrix
e = ones(p,1); % generate e-vector
K1 = K - (1/p)*(K*ones(p,1))*ones(1,p) - 1/p + (1/p^2)*sum(sum(K))
K2 = K - (1/p)*K*ones(p) - 1/p + (1/p^2)*sum(K(:))
K3 = K - (1/p)*K*e*e.' - (1/p)*e*e.' + ((e.'*K*e)/p^2)*e*e.'
K4 = K - (1/p)*K*e*e.' - (1/p)*e*e.' + sum(K(:))/p^2
结果如下:
K1 =
8.0000 5.0000 4.0000
9.6667 2.6667 4.6667
9.3333 1.3333 6.3333
K2 =
8.0000 5.0000 4.0000
9.6667 2.6667 4.6667
9.3333 1.3333 6.3333
K3 =
8.0000 5.0000 4.0000
9.6667 2.6667 4.6667
9.3333 1.3333 6.3333
K4 =
8.0000 5.0000 4.0000
9.6667 2.6667 4.6667
9.3333 1.3333 6.3333