2016-11-06 143 views
1

我試圖在Java中表示一個任意尺寸的矩陣作爲1d數組,我正在努力實現我正在寫的函數來計算給定位置的數組中正確的索引在矩陣中。這是我到目前爲止有:Java多維數組索引

private int indexOf(int... indices) { 
    assert indices.length == rank() : 
     "Number of indices does not match rank"; 
    if(indices.length == 1) return indices[0]; 
    int x = 0; 
    for(int i = 1; i < indices.length; ++i){ 
     x += indices[i] % this.dims[i]; 
    } 
    return x; 
} 

凡秩()返回矩陣尺寸和this.dims的數量與每個維度的大小的數組。

我知道i = y * numCols + x適用於二維版本,但我只是無法抽象出具有可變維度的矩陣。

感謝您的幫助。

+0

您的尺寸是否始終大小相同?換句話說,是一個二維數組總是_N x N_和一個5維數組_N x N x N x N x N_?或者2D數組可以是_N x M_? – pathfinderelite

+0

第二種情況是正確的。每個尺寸可以是不同的尺寸。 –

+0

爲什麼不在數組中實際插入數組,有效地創建多維數組?這樣做額外的內存開銷可以忽略不計,然後實現變得微不足道。你可以做'int value = arr [4] [2] [87] [5]'而不是'int value = arr.indexof(4,2,87,5)'。 – MarcG

回答

1

對不起,我回答我自己的快樂(在JavaScript - 可運行在Chrome瀏覽器開發工具):

function SuperMatrix() { 
    this.ranks = [].slice.call(arguments); 
    this.rankCount = this.ranks.length; 

    this.arraySize = 
    this.ranks.reduce(function(a,b) { return a*b; }, 1); 

    this.dimensionSize = []; 

    this.dimensionSize[this.rankCount-1] = 1; 
    for (var i = this.rankCount-2; i >= 0; i -= 1) { 
    this.dimensionSize[i] = 
     this.dimensionSize[i+1]*this.ranks[i+1]; 
    } 

    this.array = new Array(this.arraySize); 
} 

SuperMatrix.prototype._index = function() { 

    var indexes = [].slice.call(arguments); 
    if (indexes.length !== this.rankCount) 
    throw new Error('invalid number of indexes'); 

    var index = 0; 
    for (var i = 0; i < this.rankCount; i += 1) { 
    index += indexes[i]*this.dimensionSize[i]; 
    } 

    if (index < 0 || index >= this.arraySize) 
    throw new Error('invalid index: ' + indexes.join(', ')); 

    return index; 
} 

SuperMatrix.prototype.get = function() { 
    var index = this._index.apply(this, arguments); 
    return this.array[index]; 
}; 

SuperMatrix.prototype.set = function(value) { 
    var indexes = [].slice.call(arguments, 1); 

    var index = this._index.apply(this, indexes); 
    this.array[index] = value; 

    return value; 
}; 


var foo = new SuperMatrix(2,3,5); 

for (var i = 0; i < 2; i+=1) { 
    for (var j =0; j < 3; j+=1) { 
    for (var k = 0; k < 5; k+= 1) { 
     foo.set([i,j,k].join(':'), i,j,k); 
    } 
    } 
} 

for (var i = 0; i < 2; i+=1) { 
    for (var j =0; j < 3; j+=1) { 
    for (var k = 0; k < 5; k+= 1) { 
     console.log(foo.get(i,j,k)); 
    } 
    } 
} 


console.log(foo); 

對於高維指標:當1指數的增加必須通過子數組的大小在支持數組移動。

+0

酷豆。完美的作品!再次感謝 –