Умножение матриц по Винограду

206
28 января 2019, 13:00

Пытаюсь сделать умножение матриц по Винограду, но как-то не очень получается. Прошу помощи у вас. То что есть :

#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]);
Answer 1

В статье о методе Винограда нумерация идёт от 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]);
READ ALSO
C++ Матрица в классе

C++ Матрица в классе

Как поместить этот код в класс?

178
Как читать файл в C++ построчно?

Как читать файл в C++ построчно?

Нужно, чтобы программа читала только определенные строки в файле, например, 1 строку или 7, но не весь файл целиком

210
Как отправить int Array в Dragino с помащю Lora Shild?

Как отправить int Array в Dragino с помащю Lora Shild?

У меня есть етот массив!!

199
Повреждение файлов при отключении питания и исключениях в процессах

Повреждение файлов при отключении питания и исключениях в процессах

Я занимаюсь разработкой автономных систем управления и анализа для тяжелой промышленностиИспользую язык C (C99-C11)

197