Страница 1 из 1

Умножение матриц разных размерностей

Добавлено: 31 мар 2013, 16:45
VIST
программа с функциями для транспонирования и умножения матриц. Подскажите пожалуйста , как переделать так чтобы функция multiply могла перемножать не только матрицы 3 на 3 , но и матрицу 3 на 3 на матрицу 3 на 1, и как организовать проверку размерностей матриц.

Код: Выделить всё

int **transpose(int **arr, int x, int y){
	int **tmass;
	tmass=new int*[x];
	for (int i=0; i<x; i++){
		tmass[i]=new int[y];
		for (int j=0; j<y; j++){
		tmass[i][j]=arr[j][i];		
		}
	}
return tmass;
}
int **multiply(int **massiv1, int **massiv2, int x ,int y){
int **ResultMatrix=new int*[x];
int sum;	

for (int i=0; i<x; i++){
 ResultMatrix[i]=new int[y];	
 for (int j=0; j<y; j++){ 
	sum=0;
 for (int n=0; n<y; n++){
      sum+=massiv1[i][n]*massiv2[n][j];
	  }
ResultMatrix[i][j]=sum;  	  
 }
}
return ResultMatrix;
}


int main()
{  
	int **E=new int*[3];
	int **A=new int*[3];  
	int **X=new int*[3];
	int	**B=new int*[3];
	for (int i=0; i<3; i++){
		A[i]=new int[i];
		E[i]=new int[i];
		B[i]=new int[i];
		X[i]=new int[i];
		for(int j=0;j<3;j++){
		A[i][j]=rand()%(9+9+1)-9;
		B[i][j]=rand()%(9+9+1)-9;
		if (i!=j){
		E[i][j]=0;
		}
		else {E[i][i]=1;}	
		
		}
	cout<<endl;
	}
	for (int i=0; i<3; i++){
		for(int j=0;j<1;j++){
        X[i][j]=rand()%(9+9+1)-9;
		//cout<<X[i][j]<<",";
		}
		//cout<<endl;
	}
	
	int **AE=multiply(A, X, 1, 3);
	for (int g=0; g<3; g++){
	for (int k=0;k<3; k++){
		cout<<AE[g][k]<<",";
	}
	cout<<endl;
	}
	getch();
	return 0;

Re: Умножение матриц разных размерностей

Добавлено: 31 мар 2013, 17:20
rrrFer
код отформатирован ужасно, надо, например, так:

Код: Выделить всё

int **transpose(int **arr, int x, int y) {
  int **tmass;
  tmass = new int*[x];
  for (int i = 0; i < x; i++) {
    tmass[i] = new int[y];
    for (int j = 0;j < y; j++)
      tmass[i][j] = arr[j][i];     
  }
  return tmass;
}
твоя transpose не транспонирует переданную в нее матрицу, а создает новую

Если для матрицы 1000*1000 элементов типа int ты вызовешь ее в цикле 100 раз и не освободишь память (а ты так и делаешь в приведенном коде) - утечет 400 Мб памяти

multiply работает также.

Эти функции должны либо изменять переданную в них матрицу либо надо не забывать освобождать память после их вызова, т.е.

Код: Выделить всё

int **a;
a = transpose(a, .., ..); // это утечка

Re: Умножение матриц разных размерностей

Добавлено: 31 мар 2013, 17:46
rrrFer

Код: Выделить всё

for (int i=0; i<3; i++){
        A[i]=new int[i];
A - это вообще не матрица

Код: Выделить всё

int **multiply(int **massiv1, int **massiv2, int n1 ,int m1, int n2, int m2) {
  if (m1 != n2)
    return 0;
  
  int **ResultMatrix = new int*[n1]; 

  for (int i = 0; i < n1; i++) {
    ResultMatrix[i] = new int[m2];   
    for (int j = 0; j < m2; j++) {
      int sum = 0;
      for (int k = 0; k < m1; k++)
	sum += massiv1[i][k] * massiv2[k][j];
      ResultMatrix[i][j]=sum;      
    }
  }
  return ResultMatrix;
}
Не проверял, т.к. остальная часть вашего кода вобще не компилируется, а то что компилируется надо выкинуть ), ужасно