if ( feof(fp) ) break;
}
fscanf (fp,"\n");
for (i=0;i<B_I;i++) {
for (j=0;j<B_J-1;j++) {
fscanf (fp, "%i ",&MatrixB[i][j]);
if ( feof(fp) ) break;
NULL_Ib[i] = NULL_Ib[i] + MatrixB[i][j];
NULL_Jb[j] = NULL_Jb[j] + MatrixB[i][j];
}
fscanf (fp, "%i\n",&MatrixB[i][j]);
NULL_Ib[i] = NULL_Ib[i] + MatrixB[i][j];
NULL_Jb[j] = NULL_Jb[j] + MatrixB[i][j];
if ( feof(fp) ) break;
}
}
fclose(fp);
}
void ReorganizeInputMatrixes () { // algebraic manipulation of input matrixes
while (NULL_Ia[A_I-1] == 0) { // if last row of matrix А is null
A_I--;
}
while (NULL_Jb[B_J-1] == 0) { // if last column of matrix B is null
B_J--;
}
// if last column of matrix A and last row of matrix B is null
while ((NULL_Ja[A_J-1] == 0) && (NULL_Ib[B_I-1] == 0)) {
A_J--;
B_I--;
}
}
void MultiplyInputMatrixes () { // multiplication of two rectangular matrixes
int i,j,k; // counters
for (i=0;i<A_I;i++) {
for (j=0;j<B_J;j++) {
for (k=0;k<A_J;k++) {
MatrixC[i][j] = MatrixC[i][j] + MatrixA[i][k]*MatrixB[k][j];
}
}
}
}
void DisplayInputMatrixes () { // display input matrixes
int i,j; // counters
printf ("\nMatrix A\n\n");
for (i=0;i<A_I;i++) {
for (j=0;j<A_J;j++) {
printf("%i\t",MatrixA[i][j]);
}
printf("\n");
}
printf ("\nMatrix B\n\n");
for (i=0;i<B_I;i++) {
for (j=0;j<B_J;j++) {
printf("%i\t",MatrixB[i][j]);
}
printf("\n");
}
}
void DisplayResultMatrix () { // display resulting matrix
int i,j; // counters
printf ("\n\nResulting matrix C = A x B\n");
printf ("\nMatrix C\n\n");
for (i=0;i<A_I;i++) {
for (j=0;j<B_J;j++) {
printf("%i\t",MatrixC[i][j]);
}
printf("\n");
}
}
void WriteResultMatrix (char filename[255]) { // open file and write resulting matrix
FILE *fp; // pointer on file
int i,j; // counters
if ( (fp = fopen(filename, "w")) == NULL) {
Error();
fprintf(stderr, "Error saving file %s.\n",filename);
exit(0);
}
else {
for (i=0;i<A_I;i++) {
for (j=0;j<B_J;j++) {
fprintf(fp,"%i\t",MatrixC[i][j]);
}
fprintf(fp,"\n");
}
}
fclose(fp);
}
int main (int argc, char *argv[]) {
if (argv[1] == NULL){ // input filename
Error();
printf ("%s filename\n",argv[0]);
exit(0);
}
NULL_Ia[SIZE_Ia] = 0;
NULL_Ja[SIZE_Ja] = 0;
NULL_Ib[SIZE_Ib] = 0;
NULL_Jb[SIZE_Jb] = 0;
A_I = SIZE_Ia;
A_J = SIZE_Ja;
B_I = SIZE_Ib;
B_J = SIZE_Jb;
if (A_J != B_I) {
Error();
fprintf(stderr, "Error: can't multiply input matrixes.\n");
fprintf(stderr, "Number of columns of A not equal number of rows of B.\n");
exit(0);
}
NullMatrix();
ReadMatrixes (argv[1]);
if (argv[2] == NULL) {
printf ("\nInput Matrixes:\n");
DisplayInputMatrixes();
}
ReorganizeInputMatrixes();
if (argv[2] == NULL) {
printf ("\n\nReorganized Matrixes:\n");
DisplayInputMatrixes();
}
MultiplyInputMatrixes();
if (argv[2] != NULL){ // output filename
WriteResultMatrix(argv[2]);
}
else {
DisplayResultMatrix();
}
}
1.2.4 Результаты работы программы
Запуск программы: ml-mpo-lab1.exe matrixes.txt
Данные, а также ход работы, выводятся на экран.
Input Matrixes:
Matrix A
1 2 0 0 0 0 0
3 0 4 5 0 0 0
0 6 0 7 8 0 0
0 0 1 0 2 0 0
0 0 0 3 0 4 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
Matrix B
2 3 0 0 0
1 0 5 6 0
0 4 0 1 2
0 0 3 0 4
0 0 0 5 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
Reorganized Matrixes:
Matrix A
1 2 0 0 0 0
3 0 4 5 0 0
0 6 0 7 8 0
0 0 1 0 2 0
0 0 0 3 0 4
0 0 0 0 0 0
0 0 0 0 0 0
Matrix B
2 3 0 0 0
1 0 5 6 0
0 4 0 1 2
0 0 3 0 4
0 0 0 5 0
0 0 0 0 0
0 0 0 0 0
Resulting matrix C = A x B
Matrix C
4 3 10 12 0
6 25 15 4 28
6 0 51 76 28
0 4 0 11 2
0 0 9 0 12
0 0 0 0 0
0 0 0 0 0
1.2.5 Входные и выходные данные
matrixes.txt
1 2 0 0 0 0 0 0
3 0 4 5 0 0 0 0
0 6 0 7 8 0 0 0
0 0 1 0 2 0 0 0
0 0 0 3 0 4 0 0
0 0 0 0 0 0 5 0
0 0 0 0 0 0 6 0
2 3 0 0 0
1 0 5 6 0
0 4 0 1 2
0 0 3 0 4
0 0 0 5 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
Запуск программы: ml-mpo-lab1.exe matrixes.txt result.txt
Данные и ход работы не выводятся на экран, результат записывается в файл.
result.txt
4 3 10 12 0
6 25 15 4 28
6 0 51 76 28
0 4 0 11 2
0 0 9 0 12
0 0 0 0 0
0 0 0 0 0
1. Воеводин В.В. Математические основы параллельных вычислений. – М.: МГУ, 1991. – 345 с.
2. Воеводин В.В. Параллельные вычисления. – СПб: БХВ-Петербург. – 2002.
3. Молчанов И.Н. Введение в алгоритмы параллельных вычислений. К.: Наукова думка. - 1990 – 128 с.
4. Дорошенко А.Е. Математические модели и методы организации высокопроизводительных параллельных вычислений. – К.: Наукова думка, 2000 – 177 с.
5. Малышкин В.Э. Основы параллельных вычислений. Учебное пособие. – Новосибирск: Изд-во НГТУ, 2000.