2011-11-01 76 views
4

我是新來的matlab,所以我不知道所有的快捷鍵matlab已使代碼更有效和更快。我一直在matlab中一起攻擊一些作業,並着重於完成作業而不是效率。現在我發現我花的時間比實際編碼時多。下面是一個需要永久完成的嵌套for循環的頭痛。有沒有一種更快或有效的編碼方式,沒有太多的前提?更高效的Matlab代碼請

for i = 1:ysize 
for j = 1:xsize 
    MArr = zeros(windowSize^2, 2, 2); 
    for i2 = i - floor(windowSize/2): i + floor(windowSize/2) 
     if i2 > 0 && i2 < ysize + 1 
      for j2 = j - floor(windowSize/2): j + floor(windowSize/2) 
       if j2 > 0 && j2 < xsize + 1 
        mat = weight*[mappedGX(i2,j2)^2, mappedGX(i2,j2)*mappedGY(i2,j2); mappedGX(i2,j2)*mappedGY(i2,j2), mappedGY(i2,j2)^2]; 
        for i3 = 1:2 
         for j3 = 1:2 
          MArr(windowSize*(j2-(j - floor(windowSize/2))+1) + (i2-(i - floor(windowSize/2)) + 1),i3,j3) = mat(i3,j3); 
         end 
        end 
       end 
      end 
     end 
    end 
    Msum = zeros(2,2); 
    for k = size(MArr) 
     for i2 = 1:2 
      for j2 = 1:2 
       Msum = Msum + MArr(k,i2,j2); 
      end 
     end 
    end 
    R(i,j) = det(Msum) - alpha*(trace(Msum)^2); 
    R = -1 * R; 
end 
end 
+9

請告訴我們它正在做什麼的要點,以便我們瞭解您的代碼正在做什麼。看到名爲「i,i2,i3」的變量絕不是一個好兆頭.... – whatsisname

回答

8

而不是循環,使用冒號。例如:

    for i3 = 1:2 
         for j3 = 1:2 
          MArr(windowSize*(j2-(j - floor(windowSize/2))+1) + (i2-(i - floor(windowSize/2)) + 1),i3,j3) = mat(i3,j3); 
         end 
        end 

可以作爲寫:

MArr(windowSize*(j2-(j-floor(windowSize/2))+1)+(i2-(i-floor(windowSize/2))+1),:,:)=mat; 

後你會發現在那裏可以做到這一點所有的地方,學會使用索引,而不是循環的,例如,

i2 = i - floor(windowSize/2): i + floor(windowSize/2); 
i2=i2(i2>0 && i2<ysize+1); 
j2 = j - floor(windowSize/2): j + floor(windowSize/2); 
j2=j2(j2>0 && j2<xsize+1); 
mat = weight*[mappedGX(i2,j2)^2, mappedGX(i2,j2)*mappedGY(i2,j2); 

(對於高級用戶請注意:如果mappedGX是矩陣,並且i2/j2不代表矩形子矩陣,則最後一行可能不起作用。在這種情況下,您將需要sub2ind()