提高 Labview 中 Matlab 脚本的速度
Improving speed of Matlab script in Labview
我在 Labview 中使用 Matlab 脚本 运行ning 时遇到问题:在 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;
谢谢
尝试矢量化这些循环。循环通常是性能杀手,因此如果您尝试对循环进行矢量化,您可能会在 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
中。然后我们使用这个掩码来索引我们创建的绿色通道并计算正确的值并将它们放在 G1
和 G2
中的正确位置。这对其他两个 if
语句重复,并在 b2
和 b3
中看到,它们也在正确的位置突变 G1
和 G2
。
生成的操作应该模仿您在 for
循环中所做的操作,但是当您同时矢量化和消除循环时,速度会快得多。
通过将 matlab 脚本编译成可执行文件,然后从 labview 加载可执行文件,我的性能有所提高。
http://nl.mathworks.com/products/compiler/
http://digital.ni.com/public.nsf/allkb/5CF9526FF069EA8E862564C400579DBA
我在 Labview 中使用 Matlab 脚本 运行ning 时遇到问题:在 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;
谢谢
尝试矢量化这些循环。循环通常是性能杀手,因此如果您尝试对循环进行矢量化,您可能会在 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
中。然后我们使用这个掩码来索引我们创建的绿色通道并计算正确的值并将它们放在 G1
和 G2
中的正确位置。这对其他两个 if
语句重复,并在 b2
和 b3
中看到,它们也在正确的位置突变 G1
和 G2
。
生成的操作应该模仿您在 for
循环中所做的操作,但是当您同时矢量化和消除循环时,速度会快得多。
通过将 matlab 脚本编译成可执行文件,然后从 labview 加载可执行文件,我的性能有所提高。
http://nl.mathworks.com/products/compiler/
http://digital.ni.com/public.nsf/allkb/5CF9526FF069EA8E862564C400579DBA