在以下功能中,我想进行一些更改以使其快速 . 它本身很快但我必须在for循环中多次使用它所以需要很长时间 . 我想如果我用bsxfun替换repmat将使它更快但我不确定 . 我该怎么做这些替换
function out = lagcal(y1,y1k,source)
kn1 = y1(:);
kt1 = y1k(:);
kt1x = repmat(kt1,1,length(kt1));
eq11 = 1./(prod(kt1x-kt1x'+eye(length(kt1))));
eq1 = eq11'*eq11;
dist = repmat(kn1,1,length(kt1))-repmat(kt1',length(kn1),1);
[fixi,fixj] = find(dist==0); dist(fixi,fixj)=eps;
mult = 1./(dist);
eq2 = prod(dist,2);
eq22 = repmat(eq2,1,length(kt1));
eq222 = eq22 .* mult;
out = eq1 .* (eq222'*source*eq222);
end
它真的加快了我的功能吗?
1 回答
简介和代码更改
功能代码中使用的所有
repmat
用法都是将输入扩展为大小,以便稍后可以执行涉及这些输入的数学运算 . 这是bsxfun的量身定制的情况 . 可悲的是,虽然功能代码的真正瓶颈似乎是别的东西 . 在我们讨论代码的所有性能相关方面时继续保持 .接下来会显示
repmat
替换为_1874198的代码,并将替换的代码保留为评论用于比较 -这里可以添加一个修改 . 在最后一行,我们可以做如下所示的事情,但时间结果并没有显示出它的巨大好处 -
这样可以避免原始代码中先前完成的
eq1
的计算,因此您可以节省更多的时间 .基准测试
接下来讨论对代码的bsxfun修改部分与原始基于repmat的代码的基准测试 .
Benchmarking Code
Associated functions
Results
结论
基于
bsxfun
的代码显示了基于repmat的加速,这是令人鼓舞的 . 但是,在不同的数据量上对原始代码进行分析表明,最后一行中的多个矩阵乘法似乎占据了函数代码的大部分运行时间,这在MATLAB中非常有效 . 除非你有办法通过使用其他数学技术来避免这些乘法,否则它们看起来像瓶颈 .