0

我试图找到一种尽可能有效的方法来存储和调用我的 matlab 形状函数。我有一个区间x=linspace(0,20)和一个位置向量

count = 10;
for i=1:count
    pos(i)=rand()*length(x);
end

现在,我想在每个位置上放置pos(j)形状函数,例如具有紧凑支持的高斯核或帽子函数或类似的东西(应该可以轻松更改原型函数)。该函数的支持由所谓的平滑长度控制h。所以我在 .m 文件中构造了一个函数,例如(例如三次样条)

function y = W_shape(x,pos,h)

l=length(x);
y=zeros(1,l);
if (h>0)
    for i=1:l
        if (-h <= x(i)-pos && x(i)-pos < -h/2)
            y(i) = (x(i)-pos+h)^2;
        elseif (-h/2 <= x(i)-pos && x(i)-pos <= h/2)
            y(i) = -(x(i)-pos)^2 + h^2/2;
        elseif (h/2 < x(i)-pos && x(i)-pos <=h)
            y(i) = (x(i)-pos-h)^2;
        end
    end
else
    error('h must be positive')
end

然后在间隔上构造我的函数,x比如

w = zeros(count,length(x));
for j=1:count
    w(j,:)=W_shape(x,pos(j),h);
end

到目前为止一切都很好,但是当我制作x=linspace(0,20,10000)and时count=1000,我的计算机(Intel Core-i7)需要几分钟来计算整个东西。由于它应该是某种 PDE-Solver,因此必须在每个时间步(在特定情况下)执行此过程。我认为我的问题是,我将x其用作函数调用的参数并存储每个函数,而不是仅存储一个函数并对其进行移位,但是我的 matlab 知识并不是那么好,所以有什么建议吗?仅供参考:我需要两个或多个功能支持相交的区域的积分......当我在 1D 中完成这个时,我想为 2D 功能做它,所以无论如何它必须是有效的

4

1 回答 1

1

一种初始向量化是删除 W_shape 函数中的 for 循环:

for i=1:l
    if (-h <= x(i)-pos && x(i)-pos < -h/2)
        y(i) = (x(i)-pos+h)^2;
    elseif (-h/2 <= x(i)-pos && x(i)-pos <= h/2)
        y(i) = -(x(i)-pos)^2 + h^2/2;
    elseif (h/2 < x(i)-pos && x(i)-pos <=h)
        y(i) = (x(i)-pos-h)^2;
    end
end

可能成为

xmpos=x-pos; % compute once and store instead of computing numerous times
inds1=(-h <= xmpos) & (xmpos < -h/2);
y(inds1) = (xmpos(inds1)+h).^2;
inds2=(-h/2 < xmpos) & (xmpos <= h/2);
y(inds2) = -(xmpos(inds2).^2 + h^2/2;
inds3=(h/2 < xmpos) & (xmpos <=h);
y(inds3) = (xmpos(inds3)-h).^2;

可能有比这更好的优化。

编辑:我忘了提,你应该使用分析器来找出真正慢的地方!

profile on
run_code
profile viewer
于 2013-07-17T14:36:20.187 回答