Операции с матрицами Java, параллельная матрица кольта - умножение матриц

Я использовал Jama для работы с матрицами в java, но, поскольку у них нет разреженной матрицы, я начинаю использовать Параллельная холодная библиотека (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. C также может быть установлено значение null, что приводит к возврату новой матрицы.


person Memin    schedule 02.04.2013    source источник


Ответы (1)


Метод умножения матриц относится к классу DoubleAlgebra.

DenseDoubleAlgebra algebra = new DenseDoubleAlgebra();
DoubleMatrix2D productMatrix = algebra.mult(aMatrix, anotherMatrix);
person Chthonic Project    schedule 22.01.2014