gpt4 book ai didi

matlab - 优化使用 repmat 和 bsxfun 的代码

转载 作者:行者123 更新时间:2023-12-03 17:29:06 26 4
gpt4 key购买 nike

我写了下面的代码来计算矩阵:

 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×900 矩阵和 xc1yc1是 8100 x 900。我在循环中使用此代码。它非常慢,所以我想提高它的性能。我该怎么做?

最佳答案

通过将计算重新组织为对 bsxfun 的 2 次调用,我能够将速度提高约 30-40%。而不是 4:

triw = bsxfun(@times, prod(vec0).', yc1.^2-xc1.^2)-...
bsxfun(@times, diff(vec0.^2).', xc1.*yc1);

请注意,我还使用了 array transpose operator .'而不是 complex conjugate transpose operator ' .第一个只是简单地重新组织数组而不修改值,而第二个可以给你不同的结果,如果你正在处理 complex data .

这是我用来比较这两种方法的代码:
% 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

两个结果之间的最大绝对差在 floating-point relative accuracy 的数量级上。对于 double 数,因此实际上没有区别。

关于matlab - 优化使用 repmat 和 bsxfun 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46327432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com