Как умножить RealVector на RealMatrix?

Как я могу умножить данное RealVector на RealMatrix? Я не могу найти метод «умножения» для обоих классов, только preMultiply, но, похоже, он не работает:

// point to translate
final RealVector p = MatrixUtils.createRealVector(new double[] {
        3, 4, 5, 1
});

// translation matrix (6, 7, 8)
final RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {
        {1, 0, 0, 6},
        {0, 1, 0, 7},
        {0, 0, 1, 8},
        {0, 0, 0, 1}
});

// p2 = m x p
final RealVector p2 = m.preMultiply(p);
// prints {3; 4; 5; 87}
// expected {9; 11; 13; 1}
System.out.println(p2);

Пожалуйста, сравните фактический результат с ожидаемым.

Есть ли также способ умножения Vector3D на 4x4 RealMatrix, где компонент w отбрасывается? (Ищу не кастомную реализацию, а уже существующий метод в библиотеке).


person Vertex    schedule 22.10.2015    source источник


Ответы (1)


preMultiply дает вам не m x p, а p x m. Это подходит для вашего вопроса, но не для вашего комментария // p2 = m x p.

Чтобы получить желаемый результат, у вас есть два варианта:

  1. Используйте RealMatrix#operate(RealVector), который производит m x p:

    RealVector mxp = m.operate(p);    
    System.out.println(mxp);    
    
  2. Транспонируйте матрицу перед предварительным умножением:

    RealVector pxm_t = m.transpose().preMultiply(p);
    System.out.println(pxm_t);
    

Результат:

{9; 11; 13; 1}

person flo    schedule 22.10.2015
comment
Спасибо, я не ожидал такого имени метода :) - person Vertex; 22.10.2015