DevioLabавтоматичне керування капіталом
ПРАЦЮЄ 24/7
КРИПТОВАЛЮТИ · АКЦІЇ · 10 БІРЖ

Портфель, який керується автоматично

DevioLab підбирає стратегії, відстежує ринки та автоматизує купівлю і продаж активів. Кількість доступних криптовалют, акцій і торгових можливостей зростає щодня.

10підключених біржCrypto + Stocksв одному портфелі24/7автоматичний контроль

Множення матриць за алгоритмом Винограда

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерних наук та інформаційних технологій
Факультет:
КН
Кафедра:
Кафедра електронних обчислювальних машин

Інформація про роботу

Рік:
2016
Тип роботи:
Лабораторна робота
Предмет:
Алгоритми та методи обчислень
Група:
КН-31
Коротко про документ

Про що ця робота

У звіті наведено результати виконання лабораторної роботи з реалізації множення матриць за алгоритмом Винограда. Описано теоретичні відомості та наведено код програми на мові C++ з прикладом виконання.

У роботі розглядаються

  • Алгоритми та методи обчислень
  • Множення матриць
  • Алгоритм Винограда
  • Програмування на C++
  • Обчислювальна складність
  • Структури даних та масиви

Зміст і розділи

  1. Мета роботи
  2. Теоретичні відомості
  3. Завдання
  4. Код програми
  5. Висновок
Для кого:Студенти технічних спеціальностей та викладачі дисципліни алгоритмів і методів обчислень
Викладачі:Пастернак І. І.

Ключові поняття

алгоритм Виноградамноження матрицьфактори рядкафактори колонкиматрицяC++програмний кодобчислювальна складністьлабораторна робота

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” Кафедра ЕОМ / ЗВІТ з лабораторної роботи № 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 Результат виконання програми Висновок: На даній лабораторній роботі я навчилася реалізовувати множення матриць методом Винограда.
Допоможи студентському архіву

Ми допомогли тобі — допоможи наступному студенту

Файл ще не обрано

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!