2014-10-30 4 views
0

в моем источнике Java я должен выполнить следующие строки очень часто:RealMatrix размножаются без Переприсвоить

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

EigenMat является N х N матрицу с N ~ 40 vecX/vecY является N х 1 вектор (стажер RealMatrix к)

Я использовал «Sampler» из VisualFM, чтобы найти некоторые горячие точки в своем коде и

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

имеет очень высокое время выполнения. Я не профессионал java, но я думаю, что каждое умножение создает новый вектор. Могу ли я переназначить старый?

Может быть, я должен переключиться на JBLAS, чтобы ускорить его?

Matyro

Edit: Одножильный только

Hotspot2 Hotspot1

+0

Включен ли графический интерфейс? [Профиль] (http://stackoverflow.com/q/2064427/230513), чтобы направить ваше решение. – trashgod

+0

Нет вовлеченного Gui и добавил таблицу hotspot/profile из VisualVM – Matyro

+0

Как [jblas] (http://mikiobraun.github.io/jblas/) [сравнить] (http://jccaicedo.blogspot.com/2012_05_01_archive.html) ? Также рассмотрите [tag: jscience], который использует [tag: javolution]. – trashgod

ответ

0

я думаю, что каждый умножение новый вектор создается

Да, это так. Source code из 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.

 Смежные вопросы

  • Нет связанных вопросов^_^