Умножение матриц с использованием массива с ошибочными результатами - PullRequest
0 голосов
/ 23 октября 2018

Следующий код умножает две матрицы разных порядков и возвращает результаты, т.е. mat1 (6x3) * mat2 (3x6) и возвращает матрицу 6x6 в dest

проблема в том, что результат не совпадает с рассчитанным значением.Кроме того, если вы наблюдаете результаты mat2 меняет свое содержимое.

PS: итераций: 3, 0, 1 mat1 [3] [1] = 0,000000 mat2 [1][0] = 20,000000 dest [3] [0] = 0,000000

Исходное содержимое mat2 [1] [0] было равно нулю.

ВЫХОД:

iterals: 0, 0, 0    mat1[0][0] = 10.000000  mat2[0][0] = 1.000000   dest[0][0] = 10.000000
iterals: 0, 0, 1    mat1[0][1] = 0.000000   mat2[1][0] = 0.000000   dest[0][0] = 10.000000
iterals: 0, 0, 2    mat1[0][2] = 0.000000   mat2[2][0] = 0.000000   dest[0][0] = 10.000000
iterals: 0, 1, 0    mat1[0][0] = 10.000000  mat2[0][1] = 0.000000   dest[0][1] = 0.000000
iterals: 0, 1, 1    mat1[0][1] = 0.000000   mat2[1][1] = 0.000000   dest[0][1] = 0.000000
iterals: 0, 1, 2    mat1[0][2] = 0.000000   mat2[2][1] = 0.000000   dest[0][1] = 0.000000
iterals: 0, 2, 0    mat1[0][0] = 10.000000  mat2[0][2] = 0.000000   dest[0][2] = 0.000000
iterals: 0, 2, 1    mat1[0][1] = 0.000000   mat2[1][2] = 1.000000   dest[0][2] = 0.000000
iterals: 0, 2, 2    mat1[0][2] = 0.000000   mat2[2][2] = 0.000000   dest[0][2] = 0.000000
iterals: 0, 3, 0    mat1[0][0] = 10.000000  mat2[0][3] = 0.000000   dest[0][3] = 0.000000
iterals: 0, 3, 1    mat1[0][1] = 0.000000   mat2[1][3] = 0.000000   dest[0][3] = 0.000000
iterals: 0, 3, 2    mat1[0][2] = 0.000000   mat2[2][3] = 0.000000   dest[0][3] = 0.000000
iterals: 0, 4, 0    mat1[0][0] = 10.000000  mat2[0][4] = 0.000000   dest[0][4] = 0.000000
iterals: 0, 4, 1    mat1[0][1] = 0.000000   mat2[1][4] = 0.000000   dest[0][4] = 0.000000
iterals: 0, 4, 2    mat1[0][2] = 0.000000   mat2[2][4] = 1.000000   dest[0][4] = 0.000000
iterals: 0, 5, 0    mat1[0][0] = 10.000000  mat2[0][5] = 0.000000   dest[0][5] = 0.000000
iterals: 0, 5, 1    mat1[0][1] = 0.000000   mat2[1][5] = 0.000000   dest[0][5] = 0.000000
iterals: 0, 5, 2    mat1[0][2] = 0.000000   mat2[2][5] = 0.000000   dest[0][5] = 0.000000
iterals: 1, 0, 0    mat1[1][0] = 0.000000   mat2[0][0] = 1.000000   dest[1][0] = 0.000000
iterals: 1, 0, 1    mat1[1][1] = 0.000000   mat2[1][0] = 0.000000   dest[1][0] = 0.000000
iterals: 1, 0, 2    mat1[1][2] = 0.000000   mat2[2][0] = 0.000000   dest[1][0] = 0.000000
iterals: 1, 1, 0    mat1[1][0] = 0.000000   mat2[0][1] = 0.000000   dest[1][1] = 0.000000
iterals: 1, 1, 1    mat1[1][1] = 0.000000   mat2[1][1] = 0.000000   dest[1][1] = 0.000000
iterals: 1, 1, 2    mat1[1][2] = 0.000000   mat2[2][1] = 0.000000   dest[1][1] = 0.000000
iterals: 1, 2, 0    mat1[1][0] = 0.000000   mat2[0][2] = 0.000000   dest[1][2] = 0.000000
iterals: 1, 2, 1    mat1[1][1] = 0.000000   mat2[1][2] = 1.000000   dest[1][2] = 0.000000
iterals: 1, 2, 2    mat1[1][2] = 0.000000   mat2[2][2] = 0.000000   dest[1][2] = 0.000000
iterals: 1, 3, 0    mat1[1][0] = 0.000000   mat2[0][3] = 0.000000   dest[1][3] = 0.000000
iterals: 1, 3, 1    mat1[1][1] = 0.000000   mat2[1][3] = 0.000000   dest[1][3] = 0.000000
iterals: 1, 3, 2    mat1[1][2] = 0.000000   mat2[2][3] = 0.000000   dest[1][3] = 0.000000
iterals: 1, 4, 0    mat1[1][0] = 0.000000   mat2[0][4] = 0.000000   dest[1][4] = 0.000000
iterals: 1, 4, 1    mat1[1][1] = 0.000000   mat2[1][4] = 0.000000   dest[1][4] = 0.000000
iterals: 1, 4, 2    mat1[1][2] = 0.000000   mat2[2][4] = 1.000000   dest[1][4] = 0.000000
iterals: 1, 5, 0    mat1[1][0] = 0.000000   mat2[0][5] = 0.000000   dest[1][5] = 0.000000
iterals: 1, 5, 1    mat1[1][1] = 0.000000   mat2[1][5] = 0.000000   dest[1][5] = 0.000000
iterals: 1, 5, 2    mat1[1][2] = 0.000000   mat2[2][5] = 0.000000   dest[1][5] = 0.000000
iterals: 2, 0, 0    mat1[2][0] = 0.000000   mat2[0][0] = 0.000000   dest[2][0] = 0.000000
iterals: 2, 0, 1    mat1[2][1] = 20.000000  mat2[1][0] = 0.000000   dest[2][0] = 0.000000
iterals: 2, 0, 2    mat1[2][2] = 0.000000   mat2[2][0] = 0.000000   dest[2][0] = 0.000000
iterals: 2, 1, 0    mat1[2][0] = 0.000000   mat2[0][1] = 0.000000   dest[2][1] = 0.000000
iterals: 2, 1, 1    mat1[2][1] = 20.000000  mat2[1][1] = 0.000000   dest[2][1] = 0.000000
iterals: 2, 1, 2    mat1[2][2] = 0.000000   mat2[2][1] = 0.000000   dest[2][1] = 0.000000
iterals: 2, 2, 0    mat1[2][0] = 0.000000   mat2[0][2] = 0.000000   dest[2][2] = 0.000000
iterals: 2, 2, 1    mat1[2][1] = 20.000000  mat2[1][2] = 1.000000   dest[2][2] = 20.000000
iterals: 2, 2, 2    mat1[2][2] = 0.000000   mat2[2][2] = 0.000000   dest[2][2] = 20.000000
iterals: 2, 3, 0    mat1[2][0] = 0.000000   mat2[0][3] = 0.000000   dest[2][3] = 0.000000
iterals: 2, 3, 1    mat1[2][1] = 20.000000  mat2[1][3] = 0.000000   dest[2][3] = 0.000000
iterals: 2, 3, 2    mat1[2][2] = 0.000000   mat2[2][3] = 0.000000   dest[2][3] = 0.000000
iterals: 2, 4, 0    mat1[2][0] = 0.000000   mat2[0][4] = 0.000000   dest[2][4] = 0.000000
iterals: 2, 4, 1    mat1[2][1] = 20.000000  mat2[1][4] = 0.000000   dest[2][4] = 0.000000
iterals: 2, 4, 2    mat1[2][2] = 0.000000   mat2[2][4] = 1.000000   dest[2][4] = 0.000000
iterals: 2, 5, 0    mat1[2][0] = 0.000000   mat2[0][5] = 0.000000   dest[2][5] = 0.000000
iterals: 2, 5, 1    mat1[2][1] = 20.000000  mat2[1][5] = 0.000000   dest[2][5] = 0.000000
iterals: 2, 5, 2    mat1[2][2] = 0.000000   mat2[2][5] = 0.000000   dest[2][5] = 0.000000
iterals: 3, 0, 0    mat1[3][0] = 0.000000   mat2[0][0] = 0.000000   dest[3][0] = 0.000000
iterals: 3, 0, 1    mat1[3][1] = 0.000000   mat2[1][0] = 20.000000  dest[3][0] = 0.000000
iterals: 3, 0, 2    mat1[3][2] = 0.000000   mat2[2][0] = 0.000000   dest[3][0] = 0.000000
iterals: 3, 1, 0    mat1[3][0] = 0.000000   mat2[0][1] = 0.000000   dest[3][1] = 0.000000
iterals: 3, 1, 1    mat1[3][1] = 0.000000   mat2[1][1] = 0.000000   dest[3][1] = 0.000000
iterals: 3, 1, 2    mat1[3][2] = 0.000000   mat2[2][1] = 0.000000   dest[3][1] = 0.000000
iterals: 3, 2, 0    mat1[3][0] = 0.000000   mat2[0][2] = 0.000000   dest[3][2] = 0.000000
iterals: 3, 2, 1    mat1[3][1] = 0.000000   mat2[1][2] = 0.000000   dest[3][2] = 0.000000
iterals: 3, 2, 2    mat1[3][2] = 0.000000   mat2[2][2] = 0.000000   dest[3][2] = 0.000000
iterals: 3, 3, 0    mat1[3][0] = 0.000000   mat2[0][3] = 0.000000   dest[3][3] = 0.000000
iterals: 3, 3, 1    mat1[3][1] = 0.000000   mat2[1][3] = 0.000000   dest[3][3] = 0.000000
iterals: 3, 3, 2    mat1[3][2] = 0.000000   mat2[2][3] = 0.000000   dest[3][3] = 0.000000
iterals: 3, 4, 0    mat1[3][0] = 0.000000   mat2[0][4] = 0.000000   dest[3][4] = 0.000000
iterals: 3, 4, 1    mat1[3][1] = 0.000000   mat2[1][4] = 0.000000   dest[3][4] = 0.000000
iterals: 3, 4, 2    mat1[3][2] = 0.000000   mat2[2][4] = 1.000000   dest[3][4] = 0.000000
iterals: 3, 5, 0    mat1[3][0] = 0.000000   mat2[0][5] = 0.000000   dest[3][5] = 0.000000
iterals: 3, 5, 1    mat1[3][1] = 0.000000   mat2[1][5] = 0.000000   dest[3][5] = 0.000000
iterals: 3, 5, 2    mat1[3][2] = 0.000000   mat2[2][5] = 0.000000   dest[3][5] = 0.000000
iterals: 4, 0, 0    mat1[4][0] = 0.000000   mat2[0][0] = 0.000000   dest[4][0] = 0.000000
iterals: 4, 0, 1    mat1[4][1] = 0.000000   mat2[1][0] = 20.000000  dest[4][0] = 0.000000
iterals: 4, 0, 2    mat1[4][2] = 30.000000  mat2[2][0] = 0.000000   dest[4][0] = 0.000000
iterals: 4, 1, 0    mat1[4][0] = 0.000000   mat2[0][1] = 0.000000   dest[4][1] = 0.000000
iterals: 4, 1, 1    mat1[4][1] = 0.000000   mat2[1][1] = 0.000000   dest[4][1] = 0.000000
iterals: 4, 1, 2    mat1[4][2] = 30.000000  mat2[2][1] = 0.000000   dest[4][1] = 0.000000
iterals: 4, 2, 0    mat1[4][0] = 0.000000   mat2[0][2] = 0.000000   dest[4][2] = 0.000000
iterals: 4, 2, 1    mat1[4][1] = 0.000000   mat2[1][2] = 0.000000   dest[4][2] = 0.000000
iterals: 4, 2, 2    mat1[4][2] = 30.000000  mat2[2][2] = 0.000000   dest[4][2] = 0.000000
iterals: 4, 3, 0    mat1[4][0] = 0.000000   mat2[0][3] = 0.000000   dest[4][3] = 0.000000
iterals: 4, 3, 1    mat1[4][1] = 0.000000   mat2[1][3] = 0.000000   dest[4][3] = 0.000000
iterals: 4, 3, 2    mat1[4][2] = 30.000000  mat2[2][3] = 0.000000   dest[4][3] = 0.000000
iterals: 4, 4, 0    mat1[4][0] = 0.000000   mat2[0][4] = 0.000000   dest[4][4] = 0.000000
iterals: 4, 4, 1    mat1[4][1] = 0.000000   mat2[1][4] = 0.000000   dest[4][4] = 0.000000
iterals: 4, 4, 2    mat1[4][2] = 30.000000  mat2[2][4] = 0.000000   dest[4][4] = 0.000000
iterals: 4, 5, 0    mat1[4][0] = 0.000000   mat2[0][5] = 0.000000   dest[4][5] = 0.000000
iterals: 4, 5, 1    mat1[4][1] = 0.000000   mat2[1][5] = 0.000000   dest[4][5] = 0.000000
iterals: 4, 5, 2    mat1[4][2] = 30.000000  mat2[2][5] = 0.000000   dest[4][5] = 0.000000
iterals: 5, 0, 0    mat1[5][0] = 0.000000   mat2[0][0] = 0.000000   dest[5][0] = 0.000000
iterals: 5, 0, 1    mat1[5][1] = 0.000000   mat2[1][0] = 20.000000  dest[5][0] = 0.000000
iterals: 5, 0, 2    mat1[5][2] = 0.000000   mat2[2][0] = 0.000000   dest[5][0] = 0.000000
iterals: 5, 1, 0    mat1[5][0] = 0.000000   mat2[0][1] = 0.000000   dest[5][1] = 0.000000
iterals: 5, 1, 1    mat1[5][1] = 0.000000   mat2[1][1] = 0.000000   dest[5][1] = 0.000000
iterals: 5, 1, 2    mat1[5][2] = 0.000000   mat2[2][1] = 0.000000   dest[5][1] = 0.000000
iterals: 5, 2, 0    mat1[5][0] = 0.000000   mat2[0][2] = 0.000000   dest[5][2] = 0.000000
iterals: 5, 2, 1    mat1[5][1] = 0.000000   mat2[1][2] = 0.000000   dest[5][2] = 0.000000
iterals: 5, 2, 2    mat1[5][2] = 0.000000   mat2[2][2] = 0.000000   dest[5][2] = 0.000000
iterals: 5, 3, 0    mat1[5][0] = 0.000000   mat2[0][3] = 0.000000   dest[5][3] = 0.000000
iterals: 5, 3, 1    mat1[5][1] = 0.000000   mat2[1][3] = 0.000000   dest[5][3] = 0.000000
iterals: 5, 3, 2    mat1[5][2] = 0.000000   mat2[2][3] = 0.000000   dest[5][3] = 0.000000
iterals: 5, 4, 0    mat1[5][0] = 0.000000   mat2[0][4] = 0.000000   dest[5][4] = 0.000000
iterals: 5, 4, 1    mat1[5][1] = 0.000000   mat2[1][4] = 0.000000   dest[5][4] = 0.000000
iterals: 5, 4, 2    mat1[5][2] = 0.000000   mat2[2][4] = 0.000000   dest[5][4] = 0.000000
iterals: 5, 5, 0    mat1[5][0] = 0.000000   mat2[0][5] = 0.000000   dest[5][5] = 0.000000
iterals: 5, 5, 1    mat1[5][1] = 0.000000   mat2[1][5] = 0.000000   dest[5][5] = 0.000000
iterals: 5, 5, 2    mat1[5][2] = 0.000000   mat2[2][5] = 0.000000   dest[5][5] = 0.000000

Вот исходный код :

#include<stdio.h>

void prod(float mat1[][6], float mat2[][6], float dest[][6], int m1, int n1, int n2) {
     printf("orders: %d, %d, %d\n", m1, n1, n2);
     int i, j, k; // kmax = n1, jmax = n2, imax = m1
     for (i = 0; i < m1; i++) {
         for (j = 0; j < n2; j++) {
             dest[i][j] = 0;
             for (k = 0; k < n1; k++) {
                 dest[i][j] += mat1[i][k]*mat2[k][j];
                 printf("iterals: %d, %d, %d\t", i, j, k);
                 printf("mat1[%d][%d] = %f\t", i, k, mat1[i][k]);
                 printf("mat2[%d][%d] = %f\t", k, j, mat2[k][j]);
                 printf("dest[%d][%d] = %f\n", i, j, dest[i][j]);
             }
         }
     }
 }


void main() {
    float res[][6] = { 0 };

    float G[][6] =  { {10,  0,  0},
                      { 0,  0,  0},
                      { 0, 20,  0},
                      { 0,  0,  0},
                      { 0,  0, 30},
                      { 0,  0,  0} };

    float H[][6] =  { {1, 0, 0, 0, 0, 0},
                      {0, 0, 1, 0, 0, 0},
                      {0, 0, 0, 0, 1, 0} };

    prod(G, H, res, 6, 3, 6);
}

Ответы [ 3 ]

0 голосов
/ 23 октября 2018
  1. Ваша матрица G не имеет 6 столбцов.Он имеет 3 столбца и должен быть определен следующим образом:

    float G[][3]
    
  2. Матрице результатов необходим размер.

     float res[6][6] = { 0 };
    
  3. Вы должны определитьmain as int main(void)

  4. Определение функции также должно измениться, как показано ниже.

    void prod(float mat1[][3], float mat2[][6], float dest[][6], int m1, int n1, int n2) {
    
0 голосов
/ 23 октября 2018

Помимо float res[][6] = { 0 }; слишком мало, что другие @ mch , @ Rishikesh Raje говорят, существуют и другие проблемы.


Рассмотрим mat1[][6], mat2[][6], dest[][6] как mat1[a][b], mat2[b][c], dest[a][c] для более четкого и гибкого кода.

В C99 и, необязательно, в C11, параметром может быть массив переменной длины - VLA , что упрощает кодирование.
См. Передача многомерного массива переменной длины в функцию

void prod(int a, int b, int c, float mat1[a][b], float mat2[b][c], float dest[a][c]) {
  printf("orders: %d, %d, %d\n", a, b, c);
  for (int ai = 0; ai < a; ai++) {
    for (int ci = 0; ci < c; ci++) {
      float sum = 0.0;
      for (int bi = 0; bi < b; bi++) {
        sum += mat1[ai][bi] * mat2[bi][ci];
        printf("iterals: %d, %d, %d\t", ai, ci, bi);
        printf("mat1[%d][%d] = %2g\t", ai, bi, mat1[ai][bi]);
        printf("mat2[%d][%d] = %2g\t", bi, ci, mat2[bi][ai]);
        printf("dest[%d][%d] = %2g\n", ai, ci, sum);
      }
      dest[ai][ci] = sum;
    }
  }
}

#define A 6
#define B 3
#define C 6

int main(void) {
  float g[A][B] = { //
      {10, 0, 0}, //
      {0, 0, 0}, //
      {0, 20, 0}, //
      {0, 0, 0}, //
      {0, 0, 30}, //
      {0, 0, 0}};
  float h[B][C] = { // Note dimension change
      {1, 0, 0, 0, 0, 0}, //
      {0, 0, 1, 0, 0, 0}, //
      {0, 0, 0, 0, 1, 0}};
  float res[A][C]; // Note dimension change

  prod(A, B, C, g, h, res);
}
0 голосов
/ 23 октября 2018

float res[][6] = { 0 }; - это float res[1][6];, а не float res[6][6];, как вам нужно.Если у вас нет полного списка инициализатора, вам нужно записать все измерения.

Также void main() должно быть int main(void).

Ваш список инициализатора G также не имеетсоответствует float G[][6], это должно быть float G[][3].

Вот полный код: https://ideone.com/2hz45m

...