罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

比较repmat和bsxfun的性能

我被反复问到两个MATLAB函数的性能比较,bsxfun而且repmat.这两个函数都可以帮助计算两个数组具有相同的维数,但其中一些输入维数可能为1,而不是一致。我在这里使用的简单示例是从矩阵中减去列的均值。

内容

设置

首先我设置了数据。

M = 1e5;N = 100;A = rand(m,n);

我想写的代码

现在,这是我想要编写的代码,安全地隐藏在一个试一试声明。

试一试AZeroMean = A - mean(A);我disp (ME.message);结束
矩阵维数必须一致。

可以看到,MATLAB不允许二进制运算符处理不同大小的数组(除非其中一个输入是标量值)。至少有两种方法可以补救。

  • 存储中间计算意思是(A)在一个向量中,然后创建一个大小相同的新数组一个的行向量的复制的意思是.你可以用repmat或者通过对这个向量的行进行适当次数的索引。
  • 调用bsxfun使用适当的两个输入,并允许它执行等效的单例维度展开。这样做的好处是不需要一个大的中间数组的大小一个.这可能是一个不利因素,尤其是自从bsxfun是相对较新的,是代码不,第一次阅读,似乎是显而易见的。
  • 时机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在实际操作中,您能想到这个函数在您的工作中的用途吗?让我知道在这里




    使用MATLAB®7.6发布


    评论

    要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。