Пытаюсь сделать умножение матриц по Винограду, но как-то не очень получается. Прошу помощи у вас. То что есть :
#include <iostream>
#include <vector>
int main()
{
const int n = 5;
const int max = 10;
const int min =1;
int arr1[n][n];
int arr2[n][n];
int arr3[n][n];
std::vector <int> rowFactor;
std::vector <int> columnFactor;
int d = n/2;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
arr1[i][j] = rand()%(max-min+1) + min;
arr2[i][j] = rand()%(max-min+1) + min;
}
}
for(int i = 0 ;i<n;++i)
{
rowFactor.insert(rowFactor.end(), arr1[i][1]*arr1[i][2]);
for(int j =0;j<d;++j)
{
rowFactor.insert(rowFactor.end(),rowFactor[i] + arr1[i][2*j - 1] * arr1[i][2*j]);
}
}
for(int i = 0 ;i<n;++i)
{
columnFactor.insert(columnFactor.end(), arr2[i][1]*arr2[i][2]);
for(int j =0;j<d;++j)
{
columnFactor.insert(columnFactor.end(), columnFactor[i] + arr2[2*j - 1][ i] * arr2[2*j][ i]);
}
}
for(int i =0; i<n;++i)
{
for(int j =0;j<n;++j)
{
arr3[i][j] = -rowFactor[i] - columnFactor[j];
for(int k = 0; k< d;k++)
{
arr3[i][j]=arr3[i][j]+(arr1[i][ 2*k-1]+arr2[2*k][j])*(arr1[i][ 2*k] + arr2[2*k-1][j]);
}
}
}
std::cout<<"\nresult\n"<<std::endl;
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
std::cout << " " << arr3[i][j];
std::cout << std::endl;
}
}
Даже что-то считает, но не правильно. Думаю в этой строке ошибка
arr3[i][j]=arr3[i][j]+(arr1[i][ 2*k-1]+arr2[2*k][j])*(arr1[i][ 2*k] + arr2[2*k-1][j]);
В статье о методе Винограда нумерация идёт от 1 до N (там код написан на Паскале), и при таких данных 2k - 1 в начале равно 1, что правильно. В вашем случае нумерация идёт от 0 до N - 1, учитывая это, думаю верной будет такая строка:
arr3[i][j] = arr3[i][j] + (arr1[i][2*k] + arr2[2*k + 1][j]) * (arr1[i][2*k + 1] + arr2[2*k][j]);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно, чтобы программа читала только определенные строки в файле, например, 1 строку или 7, но не весь файл целиком
Я занимаюсь разработкой автономных систем управления и анализа для тяжелой промышленностиИспользую язык C (C99-C11)