我想在matlab中沿第3轴复制784x784矩阵。以下代码似乎有效:
mat = reshape(repmat(mat, 1,10000),784,784,10000);
不幸的是,它需要很长时间才能运行它没有价值(将10,000s更改为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次,那也是有帮助的。谢谢!
答案 0 :(得分:7)
对于超过2个维度的复制,您需要将复制计数作为数组提供:
out = repmat(mat,[1,1,10000])
答案 1 :(得分: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
,然后为每个pdf值执行z'Sz
,并应用简单函数和常量。可是等等!你也可以对它进行矢量化。
我面前没有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