Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在matlab中沿第三轴多次复制2d矩阵_Matlab - Fatal编程技术网

在matlab中沿第三轴多次复制2d矩阵

在matlab中沿第三轴多次复制2d矩阵,matlab,Matlab,我希望在matlab中沿着第三轴复制一个784x784矩阵。以下代码似乎有效: mat = reshape(repmat(mat, 1,10000),784,784,10000); 不幸的是,它需要很长时间才能运行,毫无价值(将100000更改为1000只需要几分钟,而使用10000只会使我的整个机器几乎冻结)。有没有更快的方法 作为参考,我希望在10000个向量上使用mvnpdf,每个向量的长度为784,每个向量使用相同的协方差矩阵。所以我最后的电话看起来像 mvnpdf(X,mu,mat)

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

mat = reshape(repmat(mat, 1,10000),784,784,10000);
不幸的是,它需要很长时间才能运行,毫无价值(将100000更改为1000只需要几分钟,而使用10000只会使我的整个机器几乎冻结)。有没有更快的方法

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

mvnpdf(X,mu,mat)  

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

如果有一种方法不重复协方差矩阵10000次,那也会很有帮助。谢谢

对于2维以上的复制,您需要将复制计数作为一个阵列提供:

out = repmat(mat,[1,1,10000])

创建10000次784x784矩阵不会利用MATLAB中的矢量化,这对于小型阵列更有用。考虑到以下情况,避免for循环也不会有太大帮助:

这里可以获得的主要加速是计算协方差矩阵的逆矩阵一次,然后自己计算pdf。西格玛的倒数取O(n^3),你不需要做10000次。(也可以预先计算平方根行列式。)作为参考,多元正态分布的PDF计算如下:

最好只计算一次逆,然后对每个值计算
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

在这种情况下,仅使用for循环可能比从该
repmat
获取命中更快。大部分计算时间将用于
mvnpdf
计算,因此对协方差矩阵进行计算的速度效益(以及大量内存使用)可以忽略不计。实际上,我已经用for循环编写了这篇文章,但它仍然需要很长时间:(.这是我试图重写它以提高效率,但我认为你是对的。mvnpdf是一个昂贵的操作(我想),所以不管怎样,运行10000次都可能会很慢…谢谢你的评论。你提醒我什么可以显著加快你的代码,我已经为你发布了答案。我已经为较小的值(3,10等)运行了代码,并且输出正是我想要的。不过,您的也可以工作,而且更干净(尽管不幸的是,现在更快了)。谢谢!这是一开始我从未得到的。非常有用的例子,谢谢。Duh!我太习惯于依赖内置的matlab函数了,我忘记了如何用显而易见的方法来实现。我还没有尝试过这个,但这听起来和我要找的完全一样。非常感谢!好的。请随意检查我的数学。我根据我的经验优化了一些东西ng到实际的
mvnpdf
实现。log(det(s))前面的2不应该是-1/2吗?而且,zsz'生成一个10000*10000矩阵。我认为通过z中所有列向量的for循环是更好的方法。对(-1/2)是的,不知怎的,我把-1和倒数混淆了,对于
z*s*z'
这件事,我用正确的矢量化代码进行了更新。这是一个不必使用for循环的部分:)