циклы — Попытка умножить две динамически созданные матрицы (2d вектора) вместе в переполнении стека

Так что я пытаюсь сделать это умножить один 2d вектор на другой 2d вектор.

Я пришел из Java, Python и C #, поэтому я в значительной степени изучаю C ++ по мере продвижения вперед.

У меня есть код для генерации вектора и отображения вектора, но я не могу закончить часть умножения.

v1 — другая матрица, которая уже сгенерирована.

vector<vector<int> > v2 = getVector();

int n1 = v1[0].size();
int n2 = v2.size();

vector<int> a1(n2, 0);
vector<vector<int> > ans(n1, a1);

for (int i = 0; i < n1; i++) {
for (int j = 0; j < n2; j++) {
for (int k = 0; k < 10; k++) {
// same as z[i][j] = z[i][j] + x[i][k] * y[k][j];
ans[i][j] += v1[i][k] * v2[k][j];
}
}
}

displayVector(ans);

Мое предположение о том, где я иду не так, находится в самой внутренней петле. Я не могу понять, что на самом деле поставить вместо тех 10, которые у меня есть сейчас.

1

Решение

Когда ты умножить матрицы, количество столбцов матрицы на левой стороне должно равняться количеству строк матрицы на правой стороне. Вы должны проверить, что это правда, и использовать это общее число для вашего размера k переменная:

int nCommon = v1.size();
assert(v2[0].size() == nCommon);
for (int i = 0; i < n1; i++) {
for (int j = 0; j < n2; j++) {
for (int k = 0; k < nCommon ; k++) {
ans[i][j] += v1[i][k] * v2[k][j];
}
}
}
1

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

Для вас внутренний цикл, вы должны сделать что-то вроде этого

            ans[i][j] = 0;
for (int k = 0; k < n2; k++) {
ans[i][j] += v1[i][k] * v2[k][j];
}

Я не знаю где 10 происходит от.

1