2013-07-17 42 views
0

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

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)count=1000,它需要我的电脑(Intel Core-i7)几分钟来计算整个东西。 因为它应该是某种PDE解算器,所以这个过程必须在每个时间步骤中完成(在特定情况下)。 我认为我的问题是,我用x作为我的函数调用的参数,并存储每个函数,而不是只存储一个函数,并将其转移,但是我的matlab知识并不好,所以有什么建议? Fyi:我需要两个或两个以上功能支撑相交的区域的积分...当我在1D中完成这个时,我想要做2D功能,所以它必须是高效的

回答

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 
+0

哇,这帮了很多!谢谢。现在我知道,最耗CPU的部分不是我的形状函数(虽然你的例子大大提高了效率),但我的函数找到了交点并计算了这些区域的积分。 –