Java 重新分配矩阵乘法而不重新分配

Java 重新分配矩阵乘法而不重新分配,java,optimization,blas,apache-commons-math,Java,Optimization,Blas,Apache Commons Math,在我的Java源代码中,我必须经常执行以下行: vecX = EigenMat.multiply(vecX); vecY = EigenMat.multiply(vecY); 本征矩阵是一个N~40的nxn矩阵 vecX/vecY是一个N x 1的向量,它是一个实矩阵 我使用VisualFM的采样器在代码和 org.apache.commons.math3.linear.Array2DRowRealMatrix.<init>() org.apache.commons.math3.l

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

vecX = EigenMat.multiply(vecX);
vecY = EigenMat.multiply(vecY);
本征矩阵是一个N~40的nxn矩阵 vecX/vecY是一个N x 1的向量,它是一个实矩阵

我使用VisualFM的采样器在代码和

org.apache.commons.math3.linear.Array2DRowRealMatrix.<init>()
org.apache.commons.math3.linear.Array2DRowRealMatrix.multiply()
具有非常高的运行时间。 我不是java专业人士,但我认为每次乘法都会创建一个新的向量。我可以重新分配旧的吗

也许我应该换成JBLAS来加速

马蒂罗

编辑: 仅单芯

我认为每一次乘法都会产生一个新的向量

是的。乘法运算:

复制输入向量m,如注释中所述,复制m列col的所有元素,以便在连续内存中

我可以重新分配旧的吗


是的,你可以自己做乘法,写两个循环。使用getData获取对底层double[]]数据的引用。

是否涉及GUI?来指导您的决策。不涉及Gui,并且从VisualVMHow添加了热点/配置文件表?也考虑一下,杠杆作用。
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);
    }