2016-11-06 246 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

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