2016-05-16 12 views
1

我們有MATLAB中的repmat(arr,2,1,2)方法產生的格式是: arr = [6,3,9,0];農產品repmat()方法用java

L(:,:,1) = 
6 3 9 0 
6 3 9 0 

    L(:,:,2) = 
    6 3 9 0 
    6 3 9 0 

,我試圖生產相同的格式中的Java代碼是

class test24{ 
    public static void main (String [] args) { 
     int[] arr = {6,3,9,0}; 
     test24 test = new test24(); 
     System.out.println(Arrays.deepToString(test.repmat(arr,2,1,2))); 
    } 
    public static int[][][] repmat (int[] array, int rows, int columns, int  depth) 
    { 
     int arrayColumns = array.length; 
     int resultColumns = arrayColumns * columns; 

     int[][][] result = new int[rows][resultColumns][depth]; 

    int z = 0; 
    for (int d = 0; d < depth; d++) 
     { 
     for (int r = 0; r < rows; r++) 
      { 
     for (int c = 0; c < resultColumns; c++) 
      { 
      result[r][c][d] = array[z++]; 

      if (z >= arrayColumns) 
      { 
      z = 0; 

      } 
     } 
     } 
    } 
    return result; 
    } 
} 

來自java代碼的結果是:

[[6,6],[3,3],[9,9],[0,0]],[[[ 6,6],[3,3],[9,9],[0,0]] ???

請任何建議

回答

0

相信depth參數會導致該陣列內的每個值具有兩個值(int[][][] result = new int[rows][resultColumns][depth];將成爲(給定的輸入行數= 2,列= 1和深度= 2和初始數組4)new int[2][1][2])。

不完全確定repmat方法究竟應該做什麼,可能會將數組的創建更改爲int[][][] result = new int[depth][rows][resultColumns];可以解決問題。

0

我想這是因爲MATLAB使用column-major indexing而Java使用Iliffe vectors。所以MATLAB使用一個連續的內存塊存儲多維向量,其中Java存儲指針數組,每個指針指向另一個數組。

很難確切地說明代碼導致的Java數據結構是什麼。你覺得也許你可以發佈調試器的屏幕截圖嗎?你現在看起來不正確,括號甚至不匹配。

在猜測,雖然,我會建議你也許改變這一行

result[r][c][d] = array[z++]; 

的東西更像

result[d][r][c] = array[z++]; 

或者可能甚至改變內環喜歡的東西

for (int c = 0; c < columns; c++) { 
    result[d][r][c] = array; 
} 
+0

沒有什麼說Java不會將數組存儲在連續的內存塊中。 Iliffe矢量絕對可以存儲在連續的內存中。當通過指針訪問時,例如可以在C中通過遞增指針來訪問數組('int i [2,2] = {{1,2},{3,4}}; printf(「%d」,i [3])'哪裏'我[3] == *(i + 3)')。這並不是說Java具有與Iliffe矢量相同的實現。問題應該是列主要與行主要的順序,另一個問題是多維數組需要比C更多的訪問數據的方式。 – patrik

+0

@patrik問題是否行優先排序,然後'結果[d] [R] [C] =陣列[Z ++];'還在修復 – Dan

+0

這當然是真的:) – patrik