Как я могу исправить умножение матриц между двумя матрицами разной длины столбцов?

#c #matrix

#c #матрица

Вопрос:

Итак, в настоящее время у меня есть свой класс matrix, который может умножать между двумя матрицами одинаковой длины строки / столбца, но не может правильно умножать с разной длиной столбцов.

 int main() {
    
    // defaults to Matrix<float, 4, 4> a 4x4 matrix
    Matrix a(1.0f);
    
    // 4x1 matrix
    Matrix<float, 4, 1> b;
    
    b(0) = 0.1f;
    b(1) = 0.1f;
    b(2) = 0.1f;
    b(3) = 1.0f;
    
    cout << a << 'n';
    /* 
    [1 0 0 0]
    [0 1 0 0]
    [0 0 1 0]
    [0 0 0 1]
    */
    
    cout << b << 'n';
    /* 
    [0.1]
    [0.1]
    [0.1]
    [1]
    */
    
    cout << a * b << 'n';
    // Expected this message which is good
    // 4x4 matrix * 4x1 matrix = 4x1 matrix
    /* 
    
    However the log I expected for a * b was this:
    [0.1]
    [0.1]
    [0.1]
    [1.0]
    
    But got:
    [0.1]
    [0]
    [0]
    [0]
    */
    
    Matrix c;
    c(0) = 0.1f;
    c(1) = 0.1f;
    c(2) = 0.1f;
    c(3) = 1.0f;
    
    cout << a * c << 'n';
    /* 
    Multiplication between 2 matrices of the
    same row/column length work as expected
    [0.1 0 0 0]
    [0.1 0 0 0]
    [0.1 0 0 0]
    [1 0 0 0]
    */
}
 

Код умножения, матричное умножение 2 матриц одинаковой длины строки / столбца работают так, как ожидалось, но умножение с разной длиной столбцов работает не так, как ожидалось.

 template<typename T, unsigned int R = 4, unsigned int C = R, unsigned int F>
Matrix<T, R, F> operator*(const Matrix<T, R, C>amp; matrix, const Matrix<T, C, F>amp; other) {
    Matrix<T, R, F> r(0.0f);
    
    // logs matrix’s row/column length
    cout << R << "x" << C << " matrix";
    cout << " * ";

    // logs “other” matrix’s row/column length
    cout << C << "x" << F << " matrix";
    cout << " = ";

    // logs 'r'’s log and column length.
    cout << R << "x" << F << " matrix n";

    // (i.e) 4x4 matrix * 4x1 matrix = 4x1 matrix
    // this is working as expected
    
    for (int row = 0; row < R;   row) {
        for (int column = 0; column < F;   column) {
            for (int k = 0; k < F;   k)
                // operator() was overload to access the private
                // matrix array
                r(row, column)  = matrix(row, k) * other(k, column);
        } 
    }
    
    return r;
}
 

Комментарии:

1. @n.’местоимения’m. T для типа. Он определяет тип результирующей матрицы первой строки функции.

2. for (int k = 0; k < C; k) Попробуйте это!!

3. Извините за опечатку. Я C не имел T в виду.

4. Теперь я получаю [0.4 0.4 0.4 1.0], вошедший в консоль, это близко к тому, что я хотел.

5. Строка for (int k = 0; k < F; k) неверна. это должно быть for (int k = 0; k < C; k)