@vixxxen

Как исправить код умножения матриц?

Не могу понять, что сделала не так
Код умножает матрицу на эту же транспонированную матрицу. Работает при размере матрицы n*m, n<=m, если n>m выдает System.AccessViolationException.
Понимаю, что ошибка максимально глупая, но найти не могу.
Код:
namespace Liba {
	public ref class Class1
	{
	public:
		static void enter_mas(int* mas, int n);
		static void Inputmas(int** a, int n, int m);
		static void Del(int** mas, int m);
		static int** TranspMatrix(int** Matrix, int n, int m);
		static int** MulMatr(int** M1, int r1, int c1, int** M2, int r2, int c2);

	};
}

void Class1::Inputmas(int** a, int n, int m) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				a[i][j] = 0 + (rand() % 20);
			}
		}
	
int** Class1::MulMatr(int** M1, int r1, int c1, int** M2, int r2, int c2) {
		int** MulMatr = new int* [r1];
		for (int i = 0; i < r1; i++) {
			for (int j = 0; j < c2; j++) {
				MulMatr[i] = new int[c2];
				MulMatr[i][j] = 0;
				for (int k = 0; k<c1; k++) {
					MulMatr[i][j] += M1[i][k] * M2[k][j];
				}
			}

		}
		return MulMatr;
	}
int** Class1::TranspMatrix(int** Matrix, int n, int m)
	{
		int** tMatrix = new int* [m];
		for (int i = 0; i < m; i++) {
			tMatrix[i] = new int[n];
		}

		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				tMatrix[j][i] = Matrix[i][j];
		return tMatrix;
	}


int** arr = new int* [n];
int** matr = new int* [m];
for (int i = 0; i < n; i++) {
arr[i] = new int[m];
}
for (int i = 0; i < m; i++) {
matr[i] = new int[n];
}
int** mult = new int* [n];
for (int i = 0; i < n; i++) {
mult[i] = new int[m];
}
Liba::Class1::Inputmas(arr, n, m);
matr = Liba::Class1::TranspMatrix(arr, n, m);
mult = Liba::Class1::MulMatr(arr, n, m, matr, m, n);
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Код умножает матрицу на эту же транспонированную матрицу.

Приведённый код почти умножает две разные матрицы. Если перенести MulMatr[i] = new int[c2]; из цикла по j на один уровень выше в цикл по i -- будет хорошо умножать. Но к сегфолту это отношения скорее всего не имеет.
Что вызывает вопросы -- так это то, что ты не проверяешь, что r2 == c1.

Работает при размере матрицы n*m, n<=m, если n>m выдает System.AccessViolationException.

Покажи весь код.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы