0

私のJavaソースでは、次の行を頻繁に実行する必要があります:

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

EigenMat は、N ~ 40 の N x N 行列です。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ます。

古いものを再割り当てできますか?

はい、2 つのループを記述して、自分で乗算を実行できます。getData()基になる への参照を取得するために使用しますdouble[][] data

于 2014-10-30T21:33:11.797 に答える