Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
ЗВІТ
з лабораторної роботи № 7
з дисципліни: “Алгоритми та методи обчислень”
на тему: “ Множення матриць за алгоритмом Винограда ”
Мета роботи: навчитися будувати складні алгоритми.
Теоретичні відомості:
Алгоритм Винограда призначений для швидкого множення матриць. Він був розроблений Фолькером Виноградом в 1969 році і є узагальненням методу множення Карацуби на матриці. Цей алгоритм дозволяє швидше за стандартний спосіб множити матриці. На практиці це відчутно на великих матрицях, але існує ще більш швидкий алгоритм Копперсміта-Винограда[en] для множення дуже великих матриць.
На відміну від традиційного алгоритму множення матриць (за формулою /), який виконується за час /, алгоритм Штрассена множить матриці за час /, що дає виграш на великих щільних матрицях починаючи, приблизно, з матриць розміру 64 × 64.
Існує модифікація алгоритму Штрассена, для якого вимагається 7 множень та 15 додавань (замість18для звичайного алгоритму Штрассена). Матриці A,B і C діляться на блокові підматриці.
Обчислюються проміжні матриціS1 —S8,P1 —P7,T1 —T2
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
Елементи матриці C обчислюються за формулами
/
/
/
/
Завдання:
Реалізувати множення матриць за алгоритмом Винограда.
Код програми
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
setlocale(0, "UKR");
srand(time(NULL));
const int a = 2, b = 5, c = 3;
int d = b / 2;
int G[a][b];
int H[b][c];
int R[a][c];
int rowFactor[a];
int columnFactor[c];
//заповнення матриць
for (int i = 0; i < a; ++i) {
for (int j = 0; j < b; ++j) {
G[i][j] = rand() % 10;
}
}
for (int i = 0; i < b; ++i) {
for (int j = 0; j < c; ++j) {
H[i][j] = rand() % 10;
}
}
// вивід матриць
cout << "I матриця:\n";
for (int i = 0; i < a; ++i) {
for (int j = 0; j < b; ++j) {
cout << G[i][j] << " ";
}
cout << endl;
}
cout << "\nII матриця:\n";
for (int i = 0; i < b; ++i) {
for (int j = 0; j < c; ++j) {
cout << H[i][j] << " ";
}
cout << endl;
}
// обчислення rowFactors для G
for (int i = 0; i < a; ++i) {
rowFactor[i] = G[i][0] * G[i][1];
for (int j = 1; j < d; ++j) {
rowFactor[i] = rowFactor[i] + G[i][2 * j - 1] * G[i][2 * j];
}
}
cout << "\nФактори рядка для G:\n";
for (int i = 0; i < a; ++i) {
cout << rowFactor[i] << " ";
}
cout << endl;
// вобчислення columnFactors для H
for (int i = 0; i < c; ++i) {
columnFactor[i] = H[0][i] * H[1][i];
for (int j = 1; j < d; ++j) {
columnFactor[i] = columnFactor[i] + H[2 * j - 1][i] * H[2 * j][i];
}
}
cout << "\nФактори колонки для H:\n";
for (int i = 0; i < c; ++i) {
cout << columnFactor[i] << " ";
}
cout << endl;
// обрахунок матриці R
for (int i = 0; i < a; ++i) {
for (int j = 0; j < c; ++j) {
R[i][j] = -rowFactor[i] - columnFactor[j];
for (int k = 1; k < d; ++k) {
R[i][j] = R[i][j] + (G[i][2 * k - 1] + H[2 * k][j]) * (G[i][2 * k] + H[2 * k - 1][j]);
}
}
}
cout << "\nРезультат множення:\n";
for (int i = 0; i < a; ++i) {
for (int j = 0; j < c; ++j) {
cout << R[i][j] << "\t";
}
cout << endl;
}
system("pause");
return 0;
}
/
Рис.1 Результат виконання програми
Висновок: На даній лабораторній роботі я навчилася реалізовувати множення матриць методом Винограда.
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!