Матричные операции Java, параллельная матрица Кольта - умножение матриц
Я использовал Jama для работы с матрицами в Java, но так как у них нет разреженной матрицы, я начинаю использовать Parallel Cold Library (PColt). Это многопоточная версия Colt. Я пытался умножить две квадратные матрицы: AxB (это умножение матрицы на матрицу, не поэлементное (или скалярное) умножение), размер (NxN). Я не смог найти предоставленный метод умножения матрицы на матрицу в PColt (я не я не хочу поэлементного умножения), так что я закодировал метод следующим образом. Когда я умножаю на N=1000 две матрицы, на это уходит почти 5 минут. Если кто-нибудь знает, как умножить две матрицы в pcolt, будет очень благодарен. Или, если вы видите, что в коде есть какая-то ошибка, которая не нужна и усложняет задачу, пожалуйста, сообщите мне. Мой метод заключается в следующем:
/**
* Linear algebraic matrix-matrix multiplication; (new)A = A x B. A[i,j] =
* Sum(A[i,k] * B[k,j]), k=0..n-1. Matrix shapes: A(m x n), B(n x p), A(m x
* p).
*
* @param matrix1
* first matrix
* @param matrix2
* second matrix
* @return changes matrix1 with new values matrix-matrix multiplication
*/
public static FloatMatrix2D multiplyMatrix(FloatMatrix2D matrix1,
FloatMatrix2D matrix2) {
// create a matrix same size of input matrix
FloatMatrix2D resultMatrix = matrix1.like();
// matrix-matrix multiplication row of first matrix must be equal to
// column of second matrix
if (matrix1.rows() == matrix2.columns()) {
for (int i = 0; i < matrix1.rows(); i++) {
for (int j = 0; j < matrix2.columns(); j++) {
FloatMatrix1D rowVec = getRow(matrix1, i).copy();
FloatMatrix1D colVec = getCol(matrix2, j).copy();
// first multiplies each row with each column and then sum
// up the result and assign the result to value of matrix
float multOfVects = rowVec.assign(colVec,
FloatFunctions.mult).aggregate(FloatFunctions.plus,
FloatFunctions.identity);
// set sum of vectors to the new matrix
resultMatrix.setQuick(i, j, multOfVects);
}
System.out.println(" i th row "+ i);
}
} else {
System.err
.println("Row size of first matrix must be equal to Column size of second matrix: "
+ matrix1 + " != " + matrix2);
}
return resultMatrix;
}
//// РЕШЕНИЕ... Ладно, Доки, я получил решение. На самом деле забудьте код выше. PColt обеспечивает матрично-матричное умножение, но название метода сбивает с толку.
В любом случае, чтобы умножить две матрицы, используйте следующий метод:
public DoubleMatrix2D zMult (DoubleMatrix2D B, DoubleMatrix2D C) линейное алгебраическое умножение матрицы на матрицу; C = A x B; Эквивалент A.zMult(B,C,1,0, ложь, ложь)
ЗДЕСЬ ОСТОРОЖНО О ПОРЯДКЕ ПАРАМЕТРОВ, ПОТОМУ ЧТО РЕЗУЛЬТАТ СОХРАНЕН НА ПОСЛЕДНИЙ ПАРАМЕТР, ИМЕННО C.... Это действительно стоило мне много времени:|
1 ответ
Метод умножения матриц находится в DoubleAlgebra
учебный класс.
DenseDoubleAlgebra algebra = new DenseDoubleAlgebra();
DoubleMatrix2D productMatrix = algebra.mult(aMatrix, anotherMatrix);