Й способ работы с динамическими матрицами.
Основан на использовании двойного указателя, указателя на указатель.
Перед этим давайте вспомним использование операции 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.
|
|
Обратите внимание, что проводить операцию умножения можно только в том случае, если количество строк левой матрицы совпадает с количеством столбцов правой. Кроме того, A B B A. Блок-схема реализует расчет каждого элемента матрицы 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!