Алгоритмы матричной алгебры

Алгоритмы матричной алгебры

Лекция 11

Цели:

ü освоить методику написания алгоритмов матричной алгебры с использованием двухмерных массивов, перевода таких алгоритмов на язык программирования С++ и разработки соответствующего проекта в среде Visual C++ 6.0.

 

Пример 1. Даны две матрицы a и b. Вычислить сумму c=a+b, где c – новая матрица.

Ход выполнения работы

1. Для решения данной задачи используется формула для формирования элементов массива. Каждой матрице в алгоритме соответствует двухмерный массив.

2. Написать программу, соответствующую алгоритму:

Алгоритм Программа
объявление вещ: а[6][4], b[6][4], c[6][4], цел: i, j // ввод массива a построчно для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем элемент вводится ввод а[i][j] все_для j все_для i // ввод массива b построчно для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем элемент вводится ввод b[i][j] все_для j все_для i // вычисление суммы для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем находим элемент массива c // по формуле c[i][j]=a[i][j]+b[i][j] все_для j все_для i // вывод массива a построчно для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем этот элемент выводится на // экран вывод а[i][j] все_для j все_для i // вывод массива b построчно для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем этот элемент выводится на // экран вывод b[i][j] все_для j все_для i // вывод массива c построчно для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем этот элемент выводится на // экран вывод c[i][j] все_для j все_для i   #include "stdio.h" #include "math.h" #define n 6 #define m 4 int main() { float a[n][m], b[n][m], c[n][m]; int i, j; // ввод массива a построчно for(i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) { printf ("a[%i][%i]=",i,j); scanf ("%f",&a[i][j]); } } // ввод массива b построчно for(i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) { printf ("b[%i][%i]=",i,j); scanf ("%f",&b[i][j]); } } // вычисление суммы for(i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) { c[i][j]=a[i][j]+b[i][j]; } } // вывод массива a построчно for (i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) printf ("%.2f ", a[i][j]); printf ("\n"); } printf ("\n"); // вывод массива b построчно for (i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) printf ("%.2f ", b[i][j]); printf ("\n"); } printf ("\n"); // вывод массива c построчно for (i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) printf ("%.2f ", c[i][j]); printf ("\n"); } printf ("\n"); return 1; }

3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.

Пример 2. Дана матрица a и столбец b. Вычислить произведение c=a*b, где c – новый столбец.

Ход выполнения работы

1. Для решения задачи используется формула для формирования элементов массива. Матрице a в алгоритме соответствует двухмерный массив, столбцам b и c – одномерные массивы. Количество элементов массива b должно совпадать с количеством столбцов массива a, а количество элементов массива c – с количеством строк массива a.

2. Написать программу, соответствующую алгоритму:

Алгоритм Программа
объявление вещ: а[6][4], b[4], c[6], цел: i, j // ввод массива a построчно для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем элемент вводится ввод а[i][j] все_для j все_для i // ввод массива b для i=0 до 4-1 шаг 1 ввод b[i] все_для i // вычисление произведения для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива // находим i-ый элемент массива c c[i]=0 для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем находим элемент массива c // по формуле c[i]=c[i]+a[i][j]*b[j] все_для j все_для i // вывод массива a построчно для i=0 до 6-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем этот элемент выводится на // экран вывод а[i][j] все_для j все_для i // вывод массива b для i=0 до 4-1 шаг 1 вывод b[i] все_для i // вывод массива c для i=0 до 6-1 шаг 1 вывод c[i] все_для i   #include "stdio.h" #include "math.h" #define n 6 #define m 4 int main() { float a[n][m], b[m], c[n]; int i, j; // ввод массива a построчно for(i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) { printf ("a[%i][%i]=",i,j); scanf ("%f",&a[i][j]); } } // ввод массива b for(i=0; i<=m-1; i++) { printf ("b[%i]=",i); scanf ("%f",&b[i]); } // вычисление произведение for(i=0; i<=n-1; i++) { c[i]=0; for (j=0; j<=m-1; j++) { c[i]=c[i]+a[i][j]*b[j]; } } // вывод массива a построчно for (i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) printf ("%.2f ", a[i][j]); printf ("\n"); } printf ("\n"); // вывод массива b for (i=0; i<=m-1; i++) { printf ("%.2f ", b[i]); } printf ("\n"); // вывод массива c for (i=0; i<=n-1; i++) { printf ("%.2f ", c[i]); } printf ("\n"); return 1; }

3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.

Пример 3. Даны матрицы a и b. Вычислить произведение c=a*b, где c – новая матрица.

Ход выполнения работы

1. Для решения данной задачи используется формула для формирования элементов массива. Матрицам a, b и c в алгоритме соответствуют двухмерные массивы. Количество строк массива b должно совпадать с количеством столбцов массива a, а массива c будет иметь размерность , где n – количество строк массива a, m – количество столбцов массива a. Значение p определяет количество столбцов и количество строк массивов a и b соответственно.

2. Написать программу, соответствующую алгоритму:

Алгоритм Программа
объявление вещ: а[3][4], b[4][5], c[3][5], цел: i, j, k // ввод массива a построчно для i=0 до 3-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем элемент вводится ввод а[i][j] все_для j все_для i // ввод массива b построчно для i=0 до 4-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 5-1 шаг 1 // в цикле изменяется номер j // столбца массива // затем элемент вводится ввод b[i][j] все_для j все_для i // вычисление произведения для i=0 до 3-1 шаг 1 // в цикле изменяется номер строки // массива i для j=0 до 5-1 шаг 1 // находим элемент массива c c[i][j]=0 для k=0 до 4-1 шаг 1 // математическая формула // нахождения // элемента массива c c[i][j]=c[i][j]+a[i][k]*b[k][j] все_для k все_для j все_для i // вывод массива a построчно для i=0 до 3-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 4-1 шаг 1 //в цикле изменяется номер столбца вывод а[i][j] все_для j все_для i // вывод массива b построчно для i=0 до 4-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 5-1 шаг 1 //в цикле изменяется номер столбца вывод b[i][j] все_для j все_для i // вывод массива c построчно для i=0 до 3-1 шаг 1 // в цикле изменяется номер i строки // массива для j=0 до 5-1 шаг 1 //в цикле изменяется номер столбца вывод c[i][j] все_для j все_для i #include "stdio.h" #include "math.h" #define n 3 #define m 5 #define p 4 int main() { float a[n][p], b[p][m], c[n][m]; int i, j, k; // ввод массива a построчно for(i=0; i<=n-1; i++) { for (j=0; j<=p-1; j++) { printf ("a[%i][%i]=",i,j); scanf ("%f",&a[i][j]); } } // ввод массива b построчно for(i=0; i<=p-1; i++) { for (j=0; j<=m-1; j++) { printf ("b[%i][%i]=",i,j); scanf ("%f",&b[i][j]); } } // вычисление произведение for(i=0; i<=n-1; i++) { for(j=0; j<=m-1; j++) { // находим элемент массива c c[i][j]=0; for (k=0; k<=p-1; k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } // вывод массива a построчно for (i=0; i<=n-1; i++) { for (j=0; j<=p-1; j++) printf ("%.2f ", a[i][j]); printf ("\n"); } printf ("\n"); // вывод массива b построчно for (i=0; i<=p-1; i++) { for (j=0; j<=m-1; j++) printf ("%.2f ", b[i][j]); printf ("\n"); } printf ("\n"); // вывод массива c построчно for (i=0; i<=n-1; i++) { for (j=0; j<=m-1; j++) printf ("%.2f ", c[i][j]); printf ("\n"); } printf ("\n"); return 1; }

3). Создать проект и реализовать данную задачу в среде Visual C++ 6.0.