提高Labview中Matlab脚本的速度

时间:2015-05-21 06:53:45

标签: performance matlab labview

我在Labview中运行的Matlab脚本存在问题:在Matlab上运行需要0.5秒,如果从Labview调用则需要10秒以上。我知道它应该慢一些但是很好......有人可以查看我的代码,看看是否有办法改进它?我害怕在纯粹的Labview中写它......

clearvars
Size0=1024;
Size1=1280;
r=1;
g=1;
b=1;
RedArray=ones(Size0,Size1);
GreenArray=2*RedArray;
BlueArray=3*RedArray;
G1(Size0,:)=GreenArray(Size0,:);
G2(Size0,:)=GreenArray(Size0,:);
G1(1,:)=GreenArray(1,:);
G2(1,:)=GreenArray(1,:);
G1(:,Size1)=GreenArray(:,Size1);
G2(:,Size1)=GreenArray(:,Size1);
G1(:,1)=GreenArray(:,1);
G2(:,1)=GreenArray(:,1);

for(i=2:Size0-1)
  for(j=2:Size1-1)
    if(abs(GreenArray(i-1,j)-GreenArray(i+1,j))<abs(GreenArray(i,j-1)-GreenArray(i,j+1)))
        G1(i,j)=(GreenArray(i,j)+GreenArray(i-1,j))/2;
        G2(i,j)=(GreenArray(i,j)+GreenArray(i+1,j))/2;
    elseif(abs(GreenArray(i-1,j)-GreenArray(i+1,j))>abs(GreenArray(i,j-1)-GreenArray(i,j+1)))
        G1(i,j)=(GreenArray(i,j)+GreenArray(i,j+1))/2;
        G2(i,j)=(GreenArray(i,j)+GreenArray(i,j-1))/2;
    else
        G1(i,j)=(2*GreenArray(i,j)+GreenArray(i,j+1)+GreenArray(i-1,j))/4;
        G2(i,j)=(2*GreenArray(i,j)+GreenArray(i,j-1)+GreenArray(i+1,j))/4;
    end
  end
end
U=zeros(2*Size0,2*Size1);
U(1:2:2*Size0,1:2:2*Size1)=r*RedArray;
U(2:2:2*Size0,2:2:2*Size1)=b*BlueArray;
U(2:2:2*Size0,1:2:2*Size1)=g*G1;
U(1:2:2*Size0,2:2:2*Size1)=g*G2;

由于

2 个答案:

答案 0 :(得分:3)

尝试对这些循环进行矢量化。循环通常是性能杀手,所以如果你尝试对循环进行矢量化,你可以在LabVIEW中获得性能提升。

循环代码可以替换为:

[I,J] = ndgrid(2:Size0-1,2:Size1-1);
ind1 = sub2ind([Size0, Size1], I-1, J);
ind2 = sub2ind([Size0, Size1], I+1, J);
ind3 = sub2ind([Size0, Size1], I, J-1);
ind4 = sub2ind([Size0, Size1], I, J+1);

g0 = GreenArray;
g1 = GreenArray(ind1);
g2 = GreenArray(ind2);
g3 = GreenArray(ind3);
g4 = GreenArray(ind4);

b1 = abs(g1 - g2) < abs(g3 - g4);
G1(b1) = (g0(b1) + g1(b1)) / 2;
G2(b1) = (g0(b1) + g2(b1)) / 2;

b2 = abs(g1 - g2) > abs(g3 - g4);
G1(b2) = (g0(b2) + g4(b2)) / 2;
G2(b2) = (g0(b2) + g3(b2)) / 2;

b3 = abs(g1 - g2) == abs(g3 - g4);
G1(b3) = (2*g0(b3) + g4(b3) + g1(b3)) / 4;
G2(b3) = (2*g0(b3) + g3(b3) + g2(b3)) / 4;

第一个代码块生成一个坐标的2D网格,该网格跨越您在图像中的每个像素上进行迭代的位置。这些生成列主要索引,表示水平和垂直+/- 1偏移。下一批代码生成5个矩阵,用于在这些位置对绿色通道进行采样。我也打电话给GreenArray g0以便于输入。

你内心循环中有3个if条件。 g0...g4代码之后的每个代码三元组实际上是计算每个if语句。我们确定哪些位置满足第一个if条件,并将其存储为b1中的掩码。然后,我们使用此蒙版索引到我们创建的绿色通道并计算正确的值,并将它们放入G1G2中的正确位置。对于其他两个if语句重复此操作,并在b2b3中看到,这也会在正确的位置变异G1G2

由此产生的操作应该模仿你在for循环中所做的事情,但是当你对所有循环进行矢量化和消除时,这将是一个快得多的地狱。

答案 1 :(得分:1)

通过将matlab脚本编译为可执行文件,然后从labview加载可执行文件,我获得了一些性能提升。

http://nl.mathworks.com/products/compiler/

http://digital.ni.com/public.nsf/allkb/5CF9526FF069EA8E862564C400579DBA