2014-09-30 59 views
0

我有一個雙精度的圖像像素數組,其大小取決於圖像大小。假設圖像是1000x1334,我將擁有一個carryOutput [1000] [1334]雙數組。在JAVA中將大數組分解爲更小的數組

我需要在下列條件下將數組拆分成更小的double [9] [9]數組。我爲它創建了一個for循環,但卡住了一半。

//smaller array z  
double[][] z = new double[9][9]; 

    for(int length = 0; length < carryOutput.length; length+=8) 
    { 
     for(int width = 0; width < carryOutput[0].length; width+=8) 
     { 
      ... code to fill in z array here .... 
     } 
    } 

基本上,我希望有多個更小的數組是基於for循環中條件的carryOutput的子數組。

EG: length = 0, width = 0 --> z[0][0] until z[8][8] = carryOutput[0][0] until carryOutput [8][8] 
    length = 0, width = 8 --> z[0][0] until z[8][8] = carryOutput[0][9] until carryOutput [8][17] 
    .... 

這裏的問題是有一種方法,我可以避免闖入許多數組。你看,如果它是一張1000x1000的圖片,那麼會有大約100多個更小的數組。

我有一個運行的MATLAB代碼,實際上這個工作。我試圖將其翻譯成JAVA。

附件爲MATLAB代碼的部分:

 e = size(carryOutput); 
     for length=1:8:e(1)-8; 
      for wide=1:8:e(2)-8; 

       z=coef(length:length+8,wide:wide+8); 
     ... 

    row = 1; 
    col = 2; 

      if (z(row,col) < z(row,col+1)) 
        smaller = smaller+1; 
       if z(row,col+2) > z(row,col+1) 
       smaller_plus = smaller_plus+1; 
       else if z(row,col+2) < z(row,col+1) 
       smaller_minus = smaller_minus +1; 
       else if z(row,col+2) == z(row,col+1) 
       smaller_static = smaller_static +1; 
       end;end;end; 

.... 

我想類似MATLAB輸出的東西,因爲我不得不行和列在後面的代碼比較每個小陣的原因。編寫一個代碼來比較100個不同的陣列會很麻煩。

任何人都可以突出顯示我的代碼應該如何解決這個問題。

+0

...「*爲它創建了一個for循環但卡住了*」...「*我想要多個更小的數組,它是carryOutput的子數組*」*有沒有一種方法可以避免闖入許多數組*「...」*運行MATLAB代碼...試圖將其轉換爲JAVA *「很難說出你究竟在問什麼。 – DoubleDouble 2014-09-30 17:29:17

回答

0

您的應用卡住了怎麼樣?如果數組大小非常大,則可能在垃圾回收中。我不會關心拆分數組。相反,我建議增加堆到Java運行時:

java -Xms1g -Xmx1g ... 
0

我認爲你不能避免創建100+較小的陣列,但也有優化,可以使你的代碼運行得更快。例如,您可以使用System.arrayCopy()方法而不是內部for循環來更快地移動數據。

你也提到這些較小的數組的目的是要相互比較,所以你可以做的一個巨大的優化是存儲一些關於它們的內容的哈希信息(例如9x9字節的CRC32)並使用這些散列值用於確定兩個9x9陣列是否不同,而不必迭代81個字節。