2015-05-21 30 views
0

我在Labview中運行的Matlab腳本有一個問題:如果在Labview中調用,它需要0.5秒的時間在Matlab上運行,超過10秒。我知道這應該會慢一些,但是...有人可以看看我的代碼,看看有沒有辦法改進它?我害怕寫它在純的Labview ...在Labview中提高Matlab腳本的速度

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; 

感謝

+0

到底是如何調用你從LabVIEW的MATLAB代碼?它實際上是在MATLAB還是在NI的Mathscript中運行? – nekomatic

+0

也FWIW:我不是MATLAB的專家,但它看起來好像在LabVIEW中實現代碼是相當簡單的... – nekomatic

+0

vectorize循環擺脫if語句然後編譯到lib。 –

回答

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; 

第一個代碼塊產生跨越在那裏你遍歷映像中的每個像素座標的二維網格。這些生成列主要指標,表示水平和垂直+/- 1偏移量。下一批代碼將生成5個矩陣,用於在這些位置對您的綠色通道進行採樣。爲了便於打字,我還致電GreenArrayg0

在您最內層的循環中有3個if條件。代碼g0...g4之後的每個代碼三聯碼基本上都是計算每個if聲明。我們確定哪些位置滿足第一個if條件,並將其作爲掩碼存儲在b1中。然後,我們使用此掩碼來索引我們創建的綠色通道並計算正確的值,並將它們放入G1G2的正確位置。對於其他兩個if陳述重複,並在b2b3中看到,這也在合適的位置變異G1G2

由此產生的操作應該模仿for循環中你正在做的事情,但是當你矢量化和消除循環時,它會快很多。