Номера строк | Номера столбцов | ||||
1 | 2 | 3 | 4 | 5 | |
1 | b11 | b12 | 0 | 0 | 0 |
2 | b21 | 0 | b23 | b24 | 0 |
3 | 0 | b32 | 0 | b34 | b35 |
4 | 0 | 0 | b43 | 0 | b45 |
5 | 0 | 0 | 0 | b54 | 0 |
6 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 | 0 |
1.4. Строится результирующая матрица С путём перемножения матриц А и В, полученных в результате распараллеливания. Для данного примера матрица С будет иметь вид:
Матрица С [7,5]
Номера строк | Номера столбцов | ||||
1 | 2 | 3 | 4 | 5 | |
1 | а11b11+а12b21 | а11b12 | а12b23 | а12b24 | 0 |
2 | а21b11 | а21b12+а23b32 | а24b43 | а23b34 | а23b35+а24b45 |
3 | а32b21 | 0 | а32b23+а34b43 | а32b24 +а35b54 | а34b45 |
4 | 0 | а43b34 | 0 | а43b34+а45b54 | а43b35 |
5 | 0 | 0 | а54b43 | 0 | а54b45 |
6 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 | 0 |
1.2.3 Листинг текста программы
ml-mpo-lab1.c
/* Program for task solution of multiplication of two rectangular big dimension matrixes
* Решение задачи перемножения двух прямоугольных матриц большой размерности
* Copyright (C) 2005 Eugene Dokukin aka MustLive. http://mlbpg.narod.ru
* Open Source Software, GPL. http://www.gnu.org */
#include <stdio.h>
// matrix demensions: A 7x8 and B 8x5
#define SIZE_Ia 7 // max rows for matrix A
#define SIZE_Ja 8 // max columns for matrix A
#define SIZE_Ib 8 // max rows for matrix B
#define SIZE_Jb 5 // max columns for matrix B
int A_I, A_J; // number of rows and columns for matrix A
int B_I, B_J; // number of rows and columns for matrix B
int NULL_Ia[SIZE_Ia]; // nulls in rows of A
int NULL_Ja[SIZE_Ja]; // nulls in columns of A
int NULL_Ib[SIZE_Ib]; // nulls in rows of B
int NULL_Jb[SIZE_Jb]; // nulls in columns of B
int MatrixA[SIZE_Ia][SIZE_Ja]; // matrix A
int MatrixB[SIZE_Ib][SIZE_Jb]; // matrix B
int MatrixC[SIZE_Ia][SIZE_Jb]; // matrix C
void Error () { // enter correct parameters
printf ("\nProgram for task solution of multiplication\n");
printf ("of two rectangular big dimension matrixes\n");
printf ("Copyright (C) 2005 MustLive. http://mlbpg.narod.ru\n");
printf ("Open Source Software, GPL. http://www.gnu.org\n\n");
}
void NullMatrix () { // null all elements of all matrixes
int i,j; // counters
for (i=0;i<A_I;i++) {
for (j=0;j<A_J;j++) {
MatrixA[i][j] = 0;
}
}
for (i=0;i<B_I;i++) {
for (j=0;j<B_J;j++) {
MatrixB[i][j] = 0;
}
}
for (i=0;i<A_I;i++) {
for (j=0;j<B_J;j++) {
MatrixC[i][j] = 0;
}
}
}
void ReadMatrixes (char filename[255]) { // open file and read two matrixes
FILE *fp; // pointer on file
int i,j; // counters
if ( (fp = fopen(filename, "r")) == NULL) {
Error();
fprintf(stderr, "Error opening file %s.\n",filename);
exit(0);
}
else {
for (i=0;i<A_I;i++) {
for (j=0;j<A_J-1;j++) {
fscanf (fp, "%i ",&MatrixA[i][j]);
if ( feof(fp) ) break;
NULL_Ia[i] = NULL_Ia[i] + MatrixA[i][j];
NULL_Ja[j] = NULL_Ja[j] + MatrixA[i][j];
}
fscanf (fp, "%i\n",&MatrixA[i][j]);
NULL_Ia[i] = NULL_Ia[i] + MatrixA[i][j];
NULL_Ja[j] = NULL_Ja[j] + MatrixA[i][j];