为什么这个公式是用这个Matlab代码编写的?

时间:2016-07-11 10:04:00

标签: matlab matrix formula

this论文的第4部分中,以下公式显示为大小为K的核矩阵p的零中心:
formula

这是我对应上述公式的代码:

K = K - (1/p)*(K*ones(p,1))*ones(1,p) - (1/p)*ones(p,1)*(ones(1,p)*K) + (1/p^2)*sum(sum(K));

我对代码与论文中实际公式的关系感到困惑。特别是关于最后两位成员- (1/p)*ones(p,1)*(ones(1,p)*K)(1/p^2)*sum(sum(K))

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:5)

嗯,代码不完全正确。第三个术语包括K,该文件中提供的公式中没有K = K - (1/p)*(K*ones(p,1))*ones(1,p) - 1/p + (1/p^2)*sum(sum(K)) 。此外,最后一个术语不会与 e e T 相乘。但是,在这种情况下可以省略后者,因为MATLAB会自动将标量添加到矩阵中的所有元素。这同样适用于第三项,因此也可以省略 以下是具有上述简化的行的正确版本:

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来表示 e 。要获得 e T ,您只需将.'转换为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

结果如下:

{{1}}