我需要对矩阵的行进行混洗,创建一个新的随机矩阵,其具有与原始矩阵相同的所有属性。有没有比我现在采用的方法更快/更有效的方法?
private static SparseDoubleMatrix2D shuffleMatrix(SparseDoubleMatrix2D aMatrix, int[] ordering, int size) {
SparseDoubleMatrix2D result = new SparseDoubleMatrix2D(size, size);
for (int i = 0; i < size; i++) {
int row = ordering[i];
for (int col = 0; col < size; col++) {
result.set(i, col, aMatrix.get(row, col));
}
}
return result;
}
每次调用该方法时,都会根据另一种方法给出新的排序:
private static void shuffleArray(int[] ordering, MersenneTwisterFast r) {
for (int i = ordering.length - 1; i > 0; i--) {
int index = r.nextInt(i + 1);
int a = ordering[index];
ordering[index] = ordering[i];
ordering[i] = a;
}
}
答案 0 :(得分:0)
这取决于SparseDoubleMatrix2D
的实施。现在你通过重新分配矩阵中的每个元素来改变行,但是,由于只有行被洗牌而不是列,你应该能够通过重新分配每行的引用来重新分配它,这应该减少处理从O(大小*大小)到O(大小)的时间。
要回答OP关于深层复制的评论,SparseDoubleMatrix2D的良好实现将是这样的:
class Matrix2D {
private int[] ordering;
private MatrixRow[] rows;
public double getValue(int row, int col) {
return rows[ordering[row]].get(col);
}
...
}
订购开始时看起来像{0,1,2,... n-1}。当您需要随机化时,只需设置一个新的排序数组。那样,原来的顺序当中 行[]的顺序永远不会改变。