2

我希望在 matlab 中沿第三轴复制一个 784x784 矩阵。以下代码似乎有效:

mat = reshape(repmat(mat, 1,10000),784,784,10000);

不幸的是,它需要很长时间才能运行它毫无价值(将 10,000 更改为 1000 会花费几分钟,而使用 10,000 会使我的整个机器几乎冻结)。有没有更快的方法来做到这一点?

作为参考,我希望在每个长度为 784 的 10,000 个向量上使用 mvnpdf,每个向量使用相同的协方差矩阵。所以我最后的电话看起来像

mvnpdf(X,mu,mat)  

%size(X) = (10000,784), size(mu) = (10000,784), size(mat) = 784,784,10000

如果有一种方法可以不重复协方差矩阵 10,000 次,那也很有帮助。谢谢!

4

2 回答 2

7

对于超过 2 维的复制,您需要将复制计数作为数组提供:

out = repmat(mat,[1,1,10000])
于 2013-02-25T22:47:23.970 回答
3

创建 784x784 矩阵 10,000 次不会利用 MATLAB 中的矢量化,这对于小型数组将更有用。鉴于以下情况,避免 for 循环也无济于事:

您可以在这里获得的主要加速是通过计算一次协方差矩阵的逆矩阵,然后自己计算 pdf。sigma 的倒数需要 O(n^3),而你不必要地这样做了 10,000 次。(此外,可以预先计算平方根行列式。)作为参考,多元正态分布的 PDF 计算如下:

http://en.wikipedia.org/wiki/Multivariate_normal_distribution#Properties

最好只计算一次逆,然后计算z = x - mu每个值,然后z'Sz对每个 pdf 值进行计算,并应用一个简单的函数和一个常数。可是等等!您也可以对其进行矢量化。

我面前没有 MATLAB,但这基本上是你需要做的,它会立即运行。

s = inv(sigma);
c = -0.5*log(det(s)) - (k/2)*log(2*pi);
z = x - mu;                   % 10000 x 784 matrix
ans = exp( c - 0.5 .* dot(z*s, z, 2) ); % 10000 x 1 vector
于 2013-02-25T23:30:25.027 回答