Матричное умножение со случайными значениями неправильный вывод

Я написал программу, которая дает случайные значения двум матрицам и затем использует умножение, чтобы распечатать третью матрицу. Матрица 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;
}

У кого-нибудь есть предложения по исправлению этой проблемы? Я хочу удалить эту строку странных значений и иметь только два столбца.

0

Решение

Вы перепутали количество строк и столбцов. Идея состоит в том, чтобы умножить 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);
0

Другие решения

Даже если в одной из ваших матриц есть только два столбца, похоже, что цикл for все равно будет пытаться получить доступ к значениям в третьем столбце каждой строки.

two.data[k][j]

к итерирует от 0 до one.data.size()-1 или 0..2.

J также повторяется от 0 до two.data.size()-1, также 0..2.

Однако, согласно вашему описанию, twoДиапазон второго измерения матрицы составляет всего 0..1.

Неопределенное поведение. Код работает за концом вектора и читает мусор.

0

По вопросам рекламы [email protected]