0

在我的 Java 源代码中,我必须经常执行以下几行:

vecX = EigenMat.multiply(vecX);
vecY = EigenMat.multiply(vecY);

EigenMat 是一个 N x N 矩阵,其中 N~40 vecX/vecY 是一个 N x 1 向量(实习生为 RealMatrix)

我使用 VisualFM 中的“Sampler”在我的代码中找到一些热点,然后

org.apache.commons.math3.linear.Array2DRowRealMatrix.<init>()
org.apache.commons.math3.linear.Array2DRowRealMatrix.multiply()

运行时间非常长。我不是 java 专业人士,但我认为每次乘法都会创建一个新向量。我可以重新分配旧的吗?

也许我应该切换到 JBLAS 以加快速度?

马蒂罗

编辑:仅单核

热点2 热点1

4

1 回答 1

0

我认为每次乘法都会创建一个新向量

是的。源代码multiply()

public Array2DRowRealMatrix multiply(final Array2DRowRealMatrix m) {
        // Safety check.
        MatrixUtils.checkMultiplicationCompatible(this, m);

        final int nRows = this.getRowDimension();
        final int nCols = m.getColumnDimension();
        final int nSum = this.getColumnDimension();

        final double[][] outData = new double[nRows][nCols];
        // Will hold a column of "m".
        final double[] mCol = new double[nSum];
        final double[][] mData = m.data;

        // Multiply.
        for (int col = 0; col < nCols; col++) {
            // Copy all elements of column "col" of "m" so that
            // will be in contiguous memory.
            for (int mRow = 0; mRow < nSum; mRow++) {
                mCol[mRow] = mData[mRow][col];
            }

            for (int row = 0; row < nRows; row++) {
                final double[] dataRow = data[row];
                double sum = 0;
                for (int i = 0; i < nSum; i++) {
                    sum += dataRow[i] * mCol[i];
                }
                outData[row][col] = sum;
            }
        }

        return new Array2DRowRealMatrix(outData, false);
    }

输入向量m被复制,如注释中所述Copy all elements of column "col" of "m" so that will be in contiguous memory

我可以重新分配旧的吗?

是的,您可以自己执行乘法,编写两个循环。用于getData()获取对底层double[][] data.

于 2014-10-30T21:33:11.797 回答