c - 使用阵列生成错误结果的矩阵乘法

标签 c arrays matrix-multiplication

以下代码将两个不同阶数的矩阵相乘并返回结果即 ma​​t1 (6x3) * mat2 (3x6) 并在 dest 中返回 6x6 矩阵

问题是结果与计算值不匹配。此外,如果您观察到结果 ma​​t2 正在更改其内容。

PS: iterals: 3, 0, 1 mat1[3][1] = 0.000000 mat2[1][0] = 20.000000 dest[3][0] = 0.000000

The original content of mat2[1][0] was zero.

输出:

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);
}

最佳答案

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

关于c - 使用阵列生成错误结果的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52942652/

相关文章:

c - 数组 : issues declaring

python - 矩阵-矩阵乘法的函数 numpy.dot()、@ 和方法 .dot() 之间有什么区别?

c - 在 sqlite3 中,调用步骤失败后是否需要重置?

c - 查找缓冲区地址以创建 shell 代码

c - 对 C 中字符串数组的最后一列进行排序

c++ - 如何使用 GMP 创建 float 组?

string - matlab 字符串向量/数组处理(乘法 u 和 str2num)

java - 如何使用 JAMA 将矩阵乘以 vector ?

c - 多个 POSIX 线程

c - 如何从c中的数组中排序日期