比较repmat和bsxfun的性能
我被反复问到两个MATLAB函数的性能比较,bsxfun而且repmat.这两个函数都可以帮助计算两个数组具有相同的维数,但其中一些输入维数可能为1,而不是一致。我在这里使用的简单示例是从矩阵中减去列的均值。
内容
设置
首先我设置了数据。
M = 1e5;N = 100;A = rand(m,n);
我想写的代码
现在,这是我想要编写的代码,安全地隐藏在一个试一试声明。
试一试AZeroMean = A - mean(A);抓我disp (ME.message);结束
矩阵维数必须一致。
可以看到,MATLAB不允许二进制运算符处理不同大小的数组(除非其中一个输入是标量值)。至少有两种方法可以补救。
时机repmat
使用最优秀的时间Steve Eddins发布到文件交换的实用程序,我现在计时repmat计算。首先,我创建一个匿名函数来进行计算。然后我把函数句柄传递给时间.时间仔细地运行函数,使其不受第一次效果的影响,计算运行多少次才能得到有意义的结果,等等。
frepmat = @() A - repmat(mean(A),size(A,1),1);时间(frepmat)
Ans = 0.30964
使用1索引
repmat使用各种技术来复制数组,具体取决于要复制的内容的细节。一种技术是将要复制的维度中的1索引到数组中。这是一个矢量的例子。
Q = [17 PI 42 exp(1)];Q5 = repmat(q,5,1)
Q5 = 17 3.1416 42 2.7183 17 3.1416 42 2.7183 17 3.1416 42 2.7183 17 3.1416 42 2.7183 17 3.1416 42 2.7183
时间索引
我注意到一件事repmat解决方案是我需要创建一个向量意思是(A)对于这个函数。我需要做同样的事情repmat我希望能够设置一个函数调用来执行计算,这样我就可以使用时间.由于不能在不将输出赋值给变量的情况下对函数的结果进行索引,所以我创建了一个中间函数meanones帮助。
类型meanones
函数y = mean(A) mn = mean(A);y = A - mn(ones(1,size(A,1)),:);
现在我要开始计时了。
findex = @() meanones(A);时间(findex)
Ans = 0.31389
时机bsxfun
接下来看到的时间计算完成使用bsxfun.
fbsxfun = @() bsxfun(@minus,A,mean(A));时间(fbsxfun)
Ans = 0.20569
笑点
在这个例子中,bsxfun执行速度最快。现在你明白了bsxfun在实际操作中,您能想到这个函数在您的工作中的用途吗?让我知道在这里.
评论
要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。