Я написал программу, которая дает случайные значения двум матрицам и затем использует умножение, чтобы распечатать третью матрицу. Матрица 1 — 3×3 (строки, столбцы), а матрица 2 — (3×2).
Мой вывод выглядит следующим образом:
Matrix 1:
4 6 0
9 1 5
4 7 5
Matrix 2:
4 6
0 9
1 5
matrix 1 x matrix 2:
16 78 97059710
41 88 218384285
21 112 97059715
Как видите, третья матрица дает дополнительную строку / столбец со странными значениями. (97057910
так далее.)
Ниже моя функция умножения написана на C ++:
Matrix Matrix::multiply(Matrix one, Matrix two) {
int n1 = one.data[0].size();
int n2 = two.data.size();
int nCommon = one.data.size();
vector< vector<int> > temp(nCommon);
for ( int i = 0 ; i < nCommon ; i++ )
temp[i].resize(n2);
for(int i=0;i<n1;i++) {
for(int j=0;j<n2;j++) {
for(int k=0;k<nCommon;k++) {
temp[i][j]= temp[i][j] + one.data[i][k] * two.data[k][j];
}
}
}
const Matrix result = Matrix(temp);
return result;
}
У кого-нибудь есть предложения по исправлению этой проблемы? Я хочу удалить эту строку странных значений и иметь только два столбца.
Вы перепутали количество строк и столбцов. Идея состоит в том, чтобы умножить A (I x K) на B (K x J), и вот что делает код:
int n1 = one.data[0].size(); // this is K
int n2 = two.data.size(); // this is also K
int nCommon = one.data.size(); // this is I
vector< vector<int> > temp(nCommon);
for ( int i = 0 ; i < nCommon ; i++ )
temp[i].resize(n2);
// temp is now I x K, which is not what was intended,
// and the iteration over rows and columns will not be correct.
Попробуйте это вместо этого:
int n1 = one.data.size(); // this is I
int n2 = two.data[0].size(); // this is J
int nCommon = two.data.size(); // this is K
vector< vector<int> > temp(n1);
for ( int i = 0 ; i < nCommon ; i++ )
temp[i].resize(n2);
Даже если в одной из ваших матриц есть только два столбца, похоже, что цикл for все равно будет пытаться получить доступ к значениям в третьем столбце каждой строки.
two.data[k][j]
к итерирует от 0 до one.data.size()
-1 или 0..2.
J также повторяется от 0 до two.data.size()
-1, также 0..2.
Однако, согласно вашему описанию, two
Диапазон второго измерения матрицы составляет всего 0..1.
Неопределенное поведение. Код работает за концом вектора и читает мусор.