簡體   English   中英

在Labview中提高Matlab腳本的速度

[英]Improving speed of Matlab script in 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;

謝謝

嘗試向量化這些循環。 循環通常是性能的殺手,因此,如果嘗試對循環進行矢量化處理,則可能會提高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;

第一段代碼生成一個二維坐標網格,該網格跨越您迭代圖像中每個像素的位置。 這些將生成表示水平和垂直+/- 1偏移量的列主索引。 下一批代碼將生成5個矩陣,用於在這些位置對綠色通道進行采樣。 為了方便鍵入,我也將GreenArray g0

有3個if你內心最環路內的條件。 g0...g4代碼之后的每個三元組代碼實際上都if計算每個if語句。 我們確定哪些位置滿足第一個if條件,並將其作為掩碼存儲在b1 然后,我們使用此蒙版索引創建的綠色通道,並計算正確的值並將其放置在G1G2的正確位置。 對於其他兩個if語句重復此操作,並在b2b3中看到,它們也在正確的位置使G1G2突變。

產生的操作應該模仿您在for循環中所做的事情,但是當您進行向量化並一起消除循環時,這樣做的速度將大大加快。

通過將matlab腳本編譯為可執行文件,然后從labview加載可執行文件,我獲得了一些性能提升。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM