优化使用repmat和bsxfun的代码



我已经写了以下代码来计算矩阵:

 vec0=repmat(vec,1,9);
 triw = (bsxfun(@times,vecO(1,:)',yc1)-bsxfun(@times,vecO(2,:)',xc1)).*(bsxfun(@times,vecO(2,:)',yc1)+bsxfun(@times,vecO(1,:)',xc1));

vec 2 -by- 900 矩阵和 xc1 and yc1 8100 -by- 900 。我在循环中使用此代码。它非常慢,所以我想提高其性能。我该怎么做?

我能够通过将计算重组为2个调用bsxfun而不是4:

来加快30-40%的速度。
triw = bsxfun(@times, prod(vec0).', yc1.^2-xc1.^2)-...
       bsxfun(@times, diff(vec0.^2).', xc1.*yc1);

请注意,我还使用了数组转置操作员.',而不是复杂的共轭转置操作员'。第一个简单地将数组重新组织而不修改值,而如果您要处理复杂的数据,则第二个可以为您提供不同的结果。

这是我用来比较两种方法的代码:

% Random test data:
vec0 = rand(2, 8100);
xc1 = rand(8100, 900);
yc1 = rand(8100, 900);
% Define anonymous functions to test:
fcn1 = @(v, x, y) (bsxfun(@times, v(1, :).', y)-bsxfun(@times, v(2, :).', x)).*...
                  (bsxfun(@times, v(2, :).', y)+bsxfun(@times, v(1, :).', x));
fcn2 = @(v, x, y) bsxfun(@times, prod(v).', y.^2-x.^2)-...
                  bsxfun(@times, diff(v.^2).', x.*y);
% Test the mathematical accuracy:
triw1 = fcn1(vec0, xc1, yc1);
triw2 = fcn2(vec0, xc1, yc1);
max(abs(triw1(:)-triw2(:)))
ans =
     4.440892098500626e-16
% Time the results:
t1 = timeit(@() fcn1(vec0, xc1, yc1))
t1 =
   0.107775908242267  % seconds
t2 = timeit(@() fcn2(vec0, xc1, yc1))
t2 =
   0.068403928901861  % seconds

这两个结果之间的最大绝对差异是在浮点相对准确性的顺序上,因此有效地没有差异。

相关内容

  • 没有找到相关文章

最新更新