【问题标题】:Why this formula is written with this Matlab code?为什么这个公式是用这个 Matlab 代码编写的?
【发布时间】:2016-07-11 10:03:59
【问题描述】:

this 论文的第 4 节中,提出了以下公式以对大小为 p 的核矩阵 K 进行零中心化:

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

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))

谁能解释一下?

【问题讨论】:

  • 你在困惑什么?看起来您等式中的 e 只是 1s 的向量?剩下的只是应用它,同时避免显式地执行一些操作(在最后一个术语中)。
  • 我很困惑,因为最后一项应该是由K 的元素之和除以p^2 形成的矩阵,而前面的项应该是由-1/p 形成的矩阵。这似乎与 - (1/p)*ones(p,1)*(ones(1,p)*K) + (1/p^2)*sum(sum(K)); 不同,后者是 K 乘以 -1/p 以及 K's 元素之和除以 p^2 的标量值。
  • 如果我的评论不清楚,请告诉我

标签: matlab matrix formula


【解决方案1】:

好吧,代码并不完全正确。第三项包括一个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

【讨论】:

  • 只有一个字:无语。你真的过分了,非常感谢!如果可能的话,我会给你两个 +1 :)
  • 你能看看this的问题吗?
  • @justHelloWorld 我想你已经得到了答案......KC 的差异并不显着,可以通过使用 double 来改善。
  • 感谢您的评论,但正如我在更新的答案中所写的那样,这似乎不是问题:(
  • @justHelloWorld 你能告诉我为什么答案不被接受,即使它为你的问题提供了解决方案?
猜你喜欢
  • 2014-05-01
  • 2016-06-11
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
相关资源
最近更新 更多