最快的方式来改组矩阵行

时间:2015-04-27 07:39:21

标签: java matrix

我需要对矩阵的行进行混洗,创建一个新的随机矩阵,其具有与原始矩阵相同的所有属性。有没有比我现在采用的方法更快/更有效的方法?

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;
    }
}

1 个答案:

答案 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}。当您需要随机化时,只需设置一个新的排序数组。那样,原来的顺序当中 行[]的顺序永远不会改变。