Получить матрицу по правилу - C (СИ) (76451)
Формулировка задачи:
Даны квадратные матрицы А и В порядка n. Получить матрицу А(В-Е)+С, где Е-единичная матрица порядка n. а элементы матрицы вычисляются по формуле Сij=1/(i+j) i,j=1,2...n
Решение задачи: «Получить матрицу по правилу»
textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
#include <time.h>
#include <stdlib.h>
struct matrix
{
float **m;
int sz;
};
// вывод
void print_matrix(struct matrix* k)
{
int i,j;
for(i=0;i<k->sz;i++)
{
for(j=0;j<k->sz;j++)
printf("%f ", k->m[i][j]);
printf("\n");
}
printf("\n");
}
// res = a1-a2
void sub_matrix(struct matrix* a1, struct matrix* a2, struct matrix* res)
{
int i,j, s;
s = a1->sz;
for(i=0;i<s;i++)
for(j=0;j<s;j++)
res->m[i][j] = a1->m[i][j] - a2->m[i][j];
}
// res = a1 + a2
void add_matrix(struct matrix* a1, struct matrix* a2, struct matrix* res)
{
int i,j, s;
s = a1->sz;
for(i=0;i<s;i++)
for(j=0;j<s;j++)
res->m[i][j] = a1->m[i][j] + a2->m[i][j];
}
// res = a1 * a2
void mul_matrix(struct matrix* a1, struct matrix* a2, struct matrix* res)
{
float y;
int i,j, k, l, s;
s = a1->sz;
y =0.0;
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)
{
y = 0.0;
//res->m[i][j] //a1->m[i][j] //a2->m[i][j];
for(k=0;k<s;k++)
{
y+= a1->m[i][k]*a2->m[k][j];
}
res->m[i][j]=y;
}
}
}
int main()
{
int i,j, n;
struct matrix *A,*B,*C,*E,*tmp,*tmp2,*tmp3;
srand(time(0));
n = 5;
// Код повторяется, но мне самому хотелось бы узнать
// как передать функции указатель и
// выделить память в функции так, чтобы при выходе из нее
// память сохранилась
A = (struct matrix*) malloc(sizeof(struct matrix));
B = (struct matrix*) malloc(sizeof(struct matrix));
C = (struct matrix*) malloc(sizeof(struct matrix));
E = (struct matrix*) malloc(sizeof(struct matrix));
tmp = (struct matrix*) malloc(sizeof(struct matrix));
tmp2 = (struct matrix*) malloc(sizeof(struct matrix));
tmp3 = (struct matrix*) malloc(sizeof(struct matrix));
A->m = (float**) malloc(n*sizeof(float*));
B->m = (float**) malloc(n*sizeof(float*));
C->m = (float**) malloc(n*sizeof(float*));
E->m = (float**) malloc(n*sizeof(float*));
tmp->m = (float**) malloc(n*sizeof(float*));
tmp2->m = (float**) malloc(n*sizeof(float*));
tmp3->m = (float**) malloc(n*sizeof(float*));
for(i=0;i<n;i++)
{
A->m[i] = (float*) malloc(n*sizeof(float));
B->m[i] = (float*) malloc(n*sizeof(float));
C->m[i] = (float*) malloc(n*sizeof(float));
E->m[i] = (float*) malloc(n*sizeof(float));
tmp->m[i] = (float*) malloc(n*sizeof(float));
tmp2->m[i] = (float*) malloc(n*sizeof(float));
tmp3->m[i] = (float*) malloc(n*sizeof(float));
}
//
A->sz = n;
B->sz = n;
C->sz = n;
E->sz = n;
tmp->sz = n;
tmp2->sz = n;
tmp3->sz = n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if (i==j)
E->m[i][j] = 1.0;
else
E->m[i][j] = 0.0;
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
C->m[i][j] = 1.0/((float)(i+1)+(float)(j+1) ) ;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A->m[i][j] = 1.0/(float)(rand()%9+1) ;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
B->m[i][j] = 1.0/(float)(rand()%9+1) ;
print_matrix(A);
print_matrix(B);
print_matrix(C);
print_matrix(E);
sub_matrix(B, E, tmp);
print_matrix(tmp);
mul_matrix(A, tmp, tmp2);
print_matrix(tmp2);
add_matrix(tmp2, C, tmp3);
print_matrix(tmp3);
for(i=0;i<n;i++)
{
free (A->m[i]);
free (B->m[i]);
free (C->m[i]);
free (E->m[i]);
free (tmp->m[i]);
free (tmp2->m[i]);
free (tmp3->m[i]);
}
free (A->m);
free (B->m);
free (C->m);
free (E->m);
free (tmp->m);
free (tmp2->m);
free (tmp3->m);
free (A);
free (B);
free (C);
free (E);
free (tmp);
free (tmp2);
free (tmp3);
return 0;
}