#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)