Ошибка при выводе матрицы в функции
У меня проблема с умножением матриц , в функции gaussdet, примерно на 147 строчке кода у меня вызывается функция multimass которая умножает две матрицы и выдает результат произведения , в моем случае первая матрица 4 на 4, вторая 4 на 1 , при выводе их на экран проблем нет , а при выводе результирующей (в программе матрица X) со второго элемента выходит за пределы памяти , не могу разобраться почему
P.S когда будете запускать , может выходить сообщение : Problem on diagonal , это просто проверка на нулевой элемент на диагонали , если он есть то программа заканчивается (ВЫВОД ФУНКЦИИ НАПИСАЛ В КОНЦЕ ПРОГРАММЫ(ЕСЛИ ЧТО) , НО ПРОБЛЕМА ЕЩЕ НЕ РЕШЕНА) Gaussdet(A, T, size) - ТАК ВЫГЛЯДИТ; КАК ВЫГЛЯДИТ ОШИБКА :
T=
1.00 0.12 -0.24 0.06
-10.00 1.00 10.29 -3.83
-0.60 -0.24 1.00 -0.13
-0.38 -2.35 3.30 1.00
B=
-1.18
-133.32
5.12
47.83
X= -4.72
58272643341906563227001172011003450238171962660182166064623285546474534185353454120209369334948557897585914528605758787177320684741845861550522368.00
0.00
-0.00
#include <iostream>
#include <math.h>
#include <ctime>
#include <iomanip>
using namespace std;
#define clean system("cls");
#define next cout<<endl;
int ShowMtx(double** A, int size)//вывод с выравниванием
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size + 1; j++)
{
cout << fixed << setprecision(2) << setw(6) << A[i][j] << " ";
}
next
}
return 0;
}
int ShowMtx1(double** A, int size,int size1)//вывод с выравниванием
{
if (size1 != size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size1; j++)
{
cout << fixed << setprecision(2) << setw(6) << A[i][j] << " ";
}
next
}
next
}
else
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << fixed << setprecision(2) << setw(6) << A[i][j] << " ";
}
next
}
next
}
return 0;
}
int MultiMass(double** T, double** B, double** X, int size)//умножение
{
cout << "T=" << endl; ShowMtx1(T, size,size); next
cout << "B=" << endl; ShowMtx1(B,size,1); next
for (int i = 0; i < size; i++) {
for (int j = 0; j < 1; j++)
{
X[i][j] = 0;
for (int k = 0; k < size; k++)
{
X[i][j] += T[i][j] * B[j][i];
}
}
}
cout << "X="; ShowMtx1(X,size,1);
return 0;
}
int Gaussdet(double** A, double**T, int size)
{
double eps;
cout << "Enter the epsilon" << endl;
cin >> eps;// минимальный модуль элемента матрицы //
while ((eps >= 1) || (eps <= 0)) { cout << "Error , enter the epsilon(<1,>0)" << endl; cin >> eps; }
bool isNull = false;
for (int i = 0; i < size - 1; i++)
{
if (A[i][i] == 0)
{
isNull = true;
break;
}
}
if (isNull)
{
cout << "Problem on diagonal" << endl;//если находим нуль на главной диагонали, то выводим сообщение об ошибке
return 0;
}
//проверка на нулевую строку
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
int schet = 0, schet1 = 0;
if (A[i][j] < eps) schet += 1;
if ((schet == size - 1) || (schet1 == size - 1))
{
cout << "Nulevaya stroka,det=0" << endl;
}
}
}
for (int d = 0; d < size - 1; d++)//прямой ход
{
for (int i = d + 1; i < size; i++)
{
double tmp = double(A[i][d] / A[d][d]);
for (int j = 0; j < size + 1; j++)
{
A[i][j] = A[i][j] - A[d][j] * tmp;
T[i][j] = T[i][j] - T[d][j] * tmp;
}
}
}
next
int columns = size + 1;
for (int k = 1; k < size; k++)
{
int indexDop = size - k;
for (int i = size - k - 1; i >= 0; i--)
{
double tmp = A[i][indexDop] / A[indexDop][indexDop];
for (int j = indexDop; j < columns; j++)
{
A[i][j] = A[i][j] - A[indexDop][j] * tmp;
T[i][j] = T[i][j] - T[indexDop][j] * tmp;
}
}
}
ShowMtx(A, size); next
cout << "A^(-1)=" << endl; ShowMtx1(T,size,size);
int det = 1;//вычисление определителя
for (int i = 0; i < size; i++) det *= A[i][i];
cout << "det(A)=" << det << endl;
// X-матрица решений
double** B = new double* [size];
for (int i = 0; i < size; i++)
B[i] = new double[1];
for (int j = 0; j < size; j++) {
B[j][0] = A[j][size]; cout <<"B="<< B[j][0] << "\n";
}
double** X = new double* [size];
for (int i = 0; i < size; i++)
X[i] = new double[1];
cout << "X=T^(-1)*B" << endl;
MultiMass(T, B, X, size);
return 0;
}
int Summmtx(double** A, double** B, double** C, int size)//вычисление суммы матриц
{
cout << "A="; ShowMtx(A, size);
cout << "B="; ShowMtx(B, size);
for (int i = 0; i < size; i++) {// результат суммирования матриц в новую матрицу
for (int j = 0; j < size; j++)
{
C[i][j] = A[i][j] + B[i][j];
}
next
}
cout << "C="; ShowMtx(C, size);
return 0;
}
void deleteMtx(double** A, int size)
{
for (int i = 0; i < size + 1; i++)
{
delete[] A[i];
}
delete[] A;
}
void deleteMtx1(double** B, int size)
{
for (int i = 0; i < size; i++)
{
delete[] B[i];
}
delete[] B;
}
int main()
{
int rows, size, choice;
cout << "\t\t\t\t\t\tInput matrix A" << endl;//ввод матрицы A
cout << "Enter the size of matrix A (>0,<=15)" << endl;
cin >> size;
while ((size < 0) || (size > 15)) { cout << "Enter the size of matrix A again" << endl; cin >> size; }
//выход за пределы диапазона//
double** A = new double* [size];//матрица A
for (int i = 0; i < size; i++)
{
A[i] = new double[size + 1];
}
label:
cout << "1-Randomly(matrix A)\n2-Manually(matrix A) " << endl;//автоматически или вручную//
cin >> choice;
switch (choice)
{
case 1:
{
srand(time(0));
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size + 1; j++)
{
A[i][j] = rand() % 20;
}
}
break;
}
case 2:
{
for (int i = 0; i < size; i++) {
for (int j = 0; j < size + 1; j++)
{
cout << "A[" << i << "," << j << "]= ";
cin >> A[i][j];
}
next
}
break;
}
default:
{
goto label;
}
}
ShowMtx(A,size);
double** C = new double* [size];// C - копия матрицы А
for (int i = 0; i < size; i++)
{
C[i] = new double[size + 1]; C[i] = A[i];
}
double** T = new double* [size];// T-для обратной матрицы
for (int i = 0; i < size; i++)
{
T[i] = new double[size + 1];
}
for (int i = 0; i < size; i++)//заполнение смежной матрицы T
{
for (int j = 0; j < size; j++)
{
if (i == j) { T[i][j] = 1; }
else { T[i][j] = 0; }
}
}
Gaussdet(A, T, size);
}
Ответы (1 шт):
Есть несколько проблем.
- В функции умножения матрицы есть цикл с переменной
k, но она у вас нигде не используется. То есть неправильно перемножаются матрицы. - В том же цикле у вас написано
B[j][i]хотя столбцов у вас в матрицеBвсего один. Тут то вы и выходите за пределы матрицы.
Так же не очень понятно, если у вас столбцов у матрицы B ровно один, то зачем вам эта строчка for (int j = 0; j < 1; j++). Я так думаю на будущее.
Вот пример кода без ошибок описанных выше:
cout << "T=" << endl; ShowMtx1(T, size, size); next
cout << "B=" << endl; ShowMtx1(B, size, 1); next
for (int i = 0; i < size; i++) {
for (int j = 0; j < 1; j++)
{
X[i][j] = 0;
for (int k = 0; k < size; k++)
{
X[i][j] += T[i][k] * B[k][j];
}
}
}
cout << "X="; ShowMtx1(X, size, 1);