Умножение матриц на Пифагор методом строка на столбец

      Комментарии к записи Умножение матриц на Пифагор методом строка на столбец отключены

Главная Форумы Программирование Язык Пифагор Примеры Умножение матриц на Пифагор методом строка на столбец

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 неделя, 6 дн. назад.

  • Автор
    Сообщения
  • #4177

    Ниже приведена реализация умножения матриц по методу «строка на столбец» на языке Пифагор:

    matrix_mul << funcdef X {
      A << X:1;
      B << X:2:#;
      
      [((X:1:1:|, X:2:|):[!=, =]):?] ^ (
        "bad matrix size",
        {
          block {
            N << A:|;
            M << B:|;
            
            ARows << ((A,M):dup:#:[]);
            BColumns << ((B, N):dup:[]);
            
            ResultElements << (ARows, BColumns, row_col_mul):map3;
            
            ResultElements >> break;
          }
        }
      ):. >> return;
    }
    
    row_col_mul << funcdef X {
      Row << X:1;
      Column << X:2;
      
      return << ((Row, Column, vec_mul):map3:[]:sum_list);
    }
    

    Функция matrix_mul выполняет:

    • получение матриц A и B из списка-аргумента, при этом матрица B переворачивается (транспонируется), т. к. по алгоритму требуется обрабатывать столбцы этой матрицы;
    • проверку возможности умножения (корректности размеров исходных матриц);
    • получение количества строк матрицы A (N) и столбцов матрицы B до поворота (M);
    • дублирование строк и столбцов исходных матриц для последующего их умножения. При этом матрица A дублируется M раз, а затем полученный список матриц транспонируется и преобразуется в параллельный список — в результате получится список строк матрицы A, в котором каждая строка будет продублирована. Матрица B уже перевернута, поэтому ее транспонирование не требуется — выполняется только ее дублирование и преобразование в параллельный список;
    • над полученными параллельными списками выполняется функция row_col_mul.

    Функция row_col_mul принимает на вход список данных, из двух элементов, каждый из которых является двумерным списком данных, задающим строки (Row и Column), которые надо перемножить, а полученные результаты сложить. Для этого над соответствующими элементами строк (с помощью map3) выполняется функция умножения векторов (vec_mul), полученный результат преобразуется к параллельному списку, над которым выполняется функция sum_list.

    Тесты для функции умножения матриц:

    test.matrix_mul << funcdef X {
      Cases << [
        ("(2x2)x(2x2)", ( (((1,2), (3,4)), ((3,4),(5,6))):matrix_mul, ((13,16),(29,36)) ):equals),
        ("(2x3)x(3x2)", ( (((1,2,3), (4,5,6)), ((7,8),(9,1),(2,3))):matrix_mul, ((31,19),(85,55)) ):equals),
        ("(2x2)x(2x1)", ( (((1,2),(3,4)), ((5), (6))):matrix_mul, ((17), (39)) ):equals),
        ("(2x3)x(2x3)", ( (((1,2,3), (4,5,6)), ((1,2,3), (4,5,6))):matrix_mul, "bad matrix size" ):equals),
        ("(1x3)x(3x3)", ( (((1,2,3)), ((4,5,6),(7,8,9),(0,1,2))):matrix_mul, ((18,24,30)) ):equals)
      ];
      return << Cases;
    }

Для ответа в этой теме необходимо авторизоваться.