Транспонирование и умножение матриц.

  • Автор темы aaaaaa
  • Дата начала
A

aaaaaa

#1
Дана квадратная матрица А порядка n. Получить вектор А(T)b;
Элементы вектора b вычисляются по формуле: b(i)=1(i^2+2), при i-четное, b(i)=1/i , при i-нечетное.
Определить функции транспонирования квадратной матрицы и умножения квадратной матрицы на вектор.
Разместить определение данных в заголовочном файле, а определения функций и главную функцию программы в двух отдельных файлах.

Программа крашится после транспонирования, Помогите найти в ошибку, пожалуйста,и , лучше, с обьяснениями. Заранее спасибо

main.cpp:
C++:
#include <iostream>
#include <conio.h>
#include <string.h>
#include "functions.h"



using namespace std;

int main()
{
int n;
cout << " Enter n:";
cin >> n;

int** mtrx = newmatrix(n);

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
mtrx[i][j] = j;
}
}

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
printf ("%3i",mtrx[i][j]);
}
cout << endl;
}
cout << endl;
int** tmtrx = Transposition(mtrx, n);

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
printf ("%3i",tmtrx[i][j]);
}
cout << endl;
}

int** vec=newvector(n);

Fillvec(vec, n);

int **res=newvector(n);

Calculations (tmtrx, vec, res,n);

for (int i=0; i<n; i++)
{
cout << res[i];
}

cleanmem(mtrx, n);
cleanmem(tmtrx, n);
cleanmem(vec, n);
return 0;
}
functions.h:
C++:
#ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED

int** newmatrix(const int n);

int** Transposition(int** matrix,const int n);

void cleanmem(int** array, const int n);

int** newvector(const int n);

void Fillvec(int** vector,const int n);

void Calculations (int** transmax, int** vector, int** results, const int n);

#endif // FUNCTIONS_H_INCLUDED
functions.cpp:

C++:
#include <iostream>
#include <conio.h>
#include "functions.h"

using namespace std;

int** newmatrix(const int n)
{
int** array = new int*[n];
for(int i = 0; i < n; ++i)
{
array[i] = new int[n];
}
return array;
}

//-------------------------------

int** newvector(const int n)
{
int** vector=new int*[n];
return vector;
}

void Fillvec(int** vector,const int n)
{
for (int i=0; i<n; i++)
{
if (i%2==0)
{
*vector[i]=(1/i);
}
else
{
*vector[i]=(1/(i*i+2));
}
}
}

//---------------
void cleanmem(int** array, const int n)
{
for(int i = 0; i < n; ++i)
{
delete[] array[i];
}
delete[] array;
}

//---------------

int** Transposition(int** matrix, const int n)
{
int** transmatx = newmatrix(n);

for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
transmatx[j][i] = matrix[i][j];
}

}
return transmatx;
}


//-------------------------

void Calculations (int** transmatx, int** vector, int** results, const int n)
{
int sum;
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
sum+=(transmatx[i][j]+*vector[j]);
}
*results[i]=sum;
}
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#2
А как это ты так вектор интересно заполняешь? И почему у тебя вектор имеет размерность два? Это же вектор! Он должен быть одномерным.
 
A

aaaaaa

#3
Я честно говоря запутался в этих указателях уже . :lool:
Тогда, наверное, должно быть так. Но что-то все равно она крашится после транспонирования. Похоже я чего-то не понимаю. Напишите хотя-бы примерно, как это должно быть, пожалуйста.

main.cpp

C++:
#include <iostream>
#include <conio.h>
#include <string.h>
#include "functions.h"



using namespace std;

int main()
{
int n;
cout << " Enter n:";
cin >> n;

int** mtrx = newmatrix(n);

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
mtrx[i][j] = j;
}
}

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
printf ("%3i",mtrx[i][j]);
}
cout << endl;
}
cout << endl;
int** tmtrx = Transposition(mtrx, n);

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
printf ("%3i",tmtrx[i][j]);
}
cout << endl;
}
cout<< endl;

int* vec=newvector(n);

Fillvec(vec, n);

for (int i=0; i<n; i++)
{
cout << vec[i];
}
cout << endl;

int *res=newvector(n);

Calculations (tmtrx, vec, res,n);

for (int i=0; i<n; i++)
{
cout << res[i];
}

cleanmem(mtrx, n);
cleanmem(tmtrx, n);
cleanmem2(vec, n);
cleanmem2 (res, n);
return 0;
}

functions.cpp:
C++:
#include <iostream>
#include <conio.h>
#include "functions.h"

using namespace std;

int** newmatrix(const int n)
{
int** array = new int*[n];
for(int i = 0; i < n; ++i)
{
array[i] = new int[n];
}
return array;
}

//-------------------------------

int* newvector(const int n)
{
int* vector=new int [n];
return vector;
}

void Fillvec(int* vector,const int n)
{
for (int i=0; i<n; i++)
{
if (i%2==0)
{
vector[i]=(1/i);
}
else
{
vector[i]=(1/(i*i+2));
}
}
}

//---------------
void cleanmem(int** array, const int n)
{
for(int i = 0; i < n; ++i)
{
delete[] array[i];
}
delete[] array;
}

void cleanmem2(int* array, const int n)
{
delete[] array;
}

//---------------

int** Transposition(int** matrix, const int n)
{
int** transmatx = newmatrix(n);

for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
transmatx[j][i] = matrix[i][j];
}

}
return transmatx;
}


//-------------------------

void Calculations (int** transmatx, int* vector, int* results, const int n)
{
int sum;
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
sum+=(transmatx[i][j]+vector[j]);
}
results[i]=sum;
}
}

//----------------
functions.h:

C++:
ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED

int** newmatrix(const int n);

int** Transposition(int** matrix,const int n);

void cleanmem(int** array, const int n);

void cleanmem2(int* array, const int n);

int* newvector(const int n);

void Fillvec(int* vector,const int n);

void Calculations (int** transmax, int* vector, int* results, const int n);

#endif // FUNCTIONS_H_INCLUDED
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
Поправь в Calculations: изначально sum = 0; но крашится не из-за этого, а из-за того что...

vector=(1/i);

...на ноль обычно никто не делит.

P.S.: 0%2==0 <--- истина!
 
A

aaaaaa

#5
Спасибо огромное, не заметил. :lool:

Кстати, если можно, удалите пожалуйста тему. ;)