Й способ работы с динамическими матрицами.



Основан на использовании двойного указателя, указателя на указатель.

Перед этим давайте вспомним использование операции new при работе с динамическими массивами.

int main()

{

int i,n;

float *a,s;

cout<<"n=";

cin>>n;

a=new float[n];

cout << "Vvedite massiv A";

for(i=0;i<n;i++)

// cin>>a[i];

cin>>*(a+i);

for(s=0,i=0;i<n;i++)

//s+=a[i];

s+=*(a+i);

cout << "S="<<s;

delete [] a;

return 0;

}

Теперь рассмотрим использование указателей для массива указателей.

float **a;

Это указатель на float *, или указатель на массив.

void main()

{

int n,m;

float **a;

a=new float *[n];

Создали массив указателей в количестве n штук на float, каждый элемент массива, является адресом, в котором хранится указатель на float. Осталось определить значение этого указателя. Для этого организуем цикл от 0 до n-1, в котором каждый указатель будет адресовать участок памяти, в котором хранится m элементов.

for(i=0;i<n;i++)

a[i]=new float(m);

ai,j – a[i][j]

По окончании работы необходимо освободить память

for(i=0;i<n;i++)

delete a[i];

delete [];

Рассмотрим работу с динамической матрицей на примере

ЗАДАЧА 2. Задана матрица A(n,m). Сформировать вектор P(m), в который записать номера строк максимальных элементов каждого столбца. Алгоритм решения этой задачи следующий: для каждого столбца матрицы находим максимальный элемент и его номер, номер максимального элемента j-–го столбца матрицы записываем в j-–й элемент массива P.

 

#include "stdafx.h"

#include <iostream.h>

int main(int argc, char* argv[])

{

float max;

//float **a;

int *p;

int i,j,n,m,nmax;

cout<<"n=";

cin>>n;

cout<<"m=";

cin>>m;

cout<<"Vvod matrici"<<endl;

float **a=new float *[n];

//a==new float *[n];

for(i=0;i<n;i++)

a[i]=new float(m);

p=new int[m];

for(i=0;i<n;i++)

for(j=0;j<m;j++)

cin>>a[i][j];

cout<<"Matrica"<<endl;

for(i=0;i<n;i++)

{

for(j=0;j<m;j++)

cout<<a[i][j]<<"\t";

cout<<endl;

}

cout<<"Massiv P"<<endl;

for(j=0;j<m;j++)

{

max=a[0][j];

nmax=0;

for(i=1;i<n;i++)

if (a[i][j]>max)

{

max=a[i][j];

nmax=i;

}

p[j]=nmax;

cout<<p[j]<<"\t";

}

cout<<endl;

delete [] a;

return 0;

}

 

В качестве примеров работы с динамическими массивами рассмотрим следующую задачу.

ЗАДАЧА 3. Проверить является ли матрица Х решением матричного уравнения A.B.X=C.D, где A(N,N), B(N,N), C(N,N), X(N,N), D(N,N) – квадратные матрицы.

Необходимо вычислить AB=A.B, Z=AB.X, CD=C.D, затем сравнить матрицы Z и CD. Если они совпадают, то X – решение матричного уравнения.

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

Рассмотрим процесс умножения двух матриц A(N,M)*B(M,L).

Воспользовавшись правилом «строка на столбец», получим матрицу:

В общем виде формула для нахождения элемента Cij матрицы имеет вид: , где i = 1,N и j = 1,L.

Обратите внимание, что проводить операцию умножения можно только в том случае, если количество строк левой матрицы совпадает с количеством столбцов правой. Кроме того, ABBA. Блок-схема реализует расчет каждого элемента матрицы C в виде суммы по вышеприведенной формуле.

 

#include "stdafx.h"

#include <iostream.h>

void umn_matr(float **a, float **b, float **c,

int n, int m, int l)

{

int i,j,k,s;

for(i=0;i<n;i++)

for(j=0;j<l;c[i][j]=s,j++)

for(s=0,k=0;k<m;k++)

s+=a[i][k]*b[k][j];

}

 

int main()

{

float **a,**b,**c,**d, **ab, **z, **cd, **x, eps=0.1;

int i,j,n;

bool pr;

cout<<"n=";

cin>>n;

a=new float*[n];

for(i=0;i<n;i++)

a[i]=new float[n];

b=new float*[n];

for(i=0;i<n;i++)

b[i]=new float[n];

c=new float*[n];

for(i=0;i<n;i++)

c[i]=new float[n];

d=new float*[n];

for(i=0;i<n;i++)

d[i]=new float[n];

ab=new float*[n];

for(i=0;i<n;i++)

ab[i]=new float[n];

cd=new float*[n];

for(i=0;i<n;i++)

cd[i]=new float[n];

z=new float*[n];

for(i=0;i<n;i++)

z[i]=new float[n];

x=new float*[n];

for(i=0;i<n;i++)

x[i]=new float[n];

cout<<"Vvod matrici A\n";

for(i=0;i<n;i++)

for(j=0;j<n;j++)

cin>>a[i][j];

cout<<"Vvod matrici B\n";

for(i=0;i<n;i++)

for(j=0;j<n;j++)

cin>>b[i][j];

cout<<"Vvod matrici C\n";

for(i=0;i<n;i++)

for(j=0;j<n;j++)

cin>>c[i][j];

cout<<"Vvod matrici D\n";

for(i=0;i<n;i++)

for(j=0;j<n;j++)

cin>>d[i][j];

cout<<"Vvod matrici X\n";

for(i=0;i<n;i++)

for(j=0;j<n;j++)

cin>>x[i][j];

umn_matr(a,b,ab,n,n,n);

cout<<"Matrica AB"<<endl;

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

cout<<ab[i][j]<<"\t";

cout<<endl;

}

umn_matr(ab,x,z,n,n,n);

cout<<"Matrica Z"<<endl;

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

cout<<z[i][j]<<"\t";

cout<<endl;

}

umn_matr(c,d,cd,n,n,n);

cout<<"Matrica CD"<<endl;

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

cout<<cd[i][j]<<"\t";

cout<<endl;

}

pr=true;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

//if (z[i][j]!=cd[i][j]) pr=false;

if ((z[i][j]-cd[i][j])<eps) pr=false;

if (pr)

cout<<"X-reshenie"<<endl;

else

cout<<"X- nereshenie"<<endl;

return 0;

}

 

Алгоритмы решения некоторых задач обработки матриц.


Дата добавления: 2019-09-13; просмотров: 222; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!