Java 重新分配矩阵乘法而不重新分配
在我的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
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);
}