Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的矩阵乘法总是返回0?_C_Matrix_Multiplication_Zero - Fatal编程技术网

C中的矩阵乘法总是返回0?

C中的矩阵乘法总是返回0?,c,matrix,multiplication,zero,C,Matrix,Multiplication,Zero,我一直在尝试用C语言进行基本的矩阵计算,但将两个矩阵相乘总是返回0的值。在阅读了其他有类似问题的人之后,我仍然不明白为什么会发生这种情况。这是乘法函数: double** MatrixMultiplication(double** matrixA, double** matrixB, int sizeXA, int sizeYA, int sizeXB, int sizeYB) { double** matrixC = Mat

我一直在尝试用C语言进行基本的矩阵计算,但将两个矩阵相乘总是返回0的值。在阅读了其他有类似问题的人之后,我仍然不明白为什么会发生这种情况。这是乘法函数:

double** MatrixMultiplication(double** matrixA, double** matrixB,
                              int sizeXA, int sizeYA, int sizeXB, int sizeYB) 
{
    double** matrixC = MatrixAllocate(sizeXA, sizeYB);
    for (int i = 0; i < sizeXA; i++) {
        for (int j = 0; j < sizeYB; j++) {
            for (int k = 0; k < sizeXA; k++) {
                matrixC[i][j] += matrixA[i][k] * matrixB[k][j];
            }
        }
    }
    return matrixC;
}
double** MatrixAllocate(int sizeX, int sizeY) {
    double **matrix;
    matrix = (double**)malloc(sizeX*sizeof(double*));
    for (int i = 0; i < sizeX; i++)
        matrix[i] = (double*)malloc(sizeY*sizeof(double));

    for (int i = 0; i < sizeX; i++) {
        for (int j = 0; j < sizeY; j++) {
            matrix[i][j] = 0;
        }
    }
    return matrix;
}

MatrixA和MatrixB均由用户填写,打印时具有非零数据

你还有别的问题,因为这对我来说很好。请注意,我已经稍微修改了您的方法的版本。(更改了方法名称,因为只有类以大写字母开头,增加了在矩阵创建中控制初始值的能力,使其不完全为0进行测试。)

预期的产出是:

Foo
行[0]:0112
行[1]:3 4 5
第[2]行:678
酒吧
行[0]:0112
行[1]:3 4 5
第[2]行:678
Res
行[0]:15 19 23
第[1]行:455871
第[2]行:75 97 119

资料来源是:

#include <iostream>
#include <malloc.h>
#include <stdio.h>

/* Replace this method with a printf version for C compatibility*/
void print(double **mat, int x, int y)
{
  int r, c;
  for ( r = 0; r < x; r++ ) {
    std::cout << "Row [" << r << "]: ";
    for ( c = 0; c < y; c++ ) {
      std::cout << mat[r][c] << " ";
    }
    std::cout << std::endl;
  }
}

void del(double **mat, int x)
{
  int r = 0;
  for ( r = 0; r < x; r++ ) {
      free( mat[r] );
    }
  free( mat );
}

double** createMatrix(int sizeX, int sizeY, int val=0)
{

  double **matrix;
  matrix = (double **)malloc( sizeX * sizeof( double * ) );
  int i = 0;
  for (i = 0; i < sizeX; i++) {
    matrix[i] = (double *)malloc( sizeY * sizeof( double ) );
    int j = 0;
    for (j = 0; j < sizeY; j++) {
      if ( val == 0 ) {
        matrix[i][j] = 0;
      }
      else {
        matrix[i][j] = i * sizeY + j;
      }
    }
  }
  return matrix;
}

double **multiply(double **a, double **b, int xa, int ya, int xb, int yb)
{
  if ( ya != xb ) {
    printf( "Can't multiply incompatible matrices\n");
    return NULL;
  }

  double **c = createMatrix( xa, yb, 1 );
  int i,j,k;
  for ( i = 0; i < xa; i++ ) {
    for ( j = 0; j < yb; j++ ) {
      for ( k = 0; k < xb; k++ ) {
        c[i][j] += a[i][k] * b[k][j];
      }
    }
  }
  return c;
}

int main(int argc, char *argv[])
{
  double **foo = createMatrix( 3, 3 );
  double **bar = createMatrix( 3, 3 );
  double **res = NULL;

  printf( "Foo: \n" );
  print( foo, 3, 3 );
  printf( "Bar: \n" );
  print( bar, 3, 3 );

  res = multiply( foo, bar, 3, 3, 3, 3);
  printf( "Res: \n" );

  if ( res ) {
    print( res, 3, 3 );
    del( res, 3 );
  }
  else {
    printf("Couldn't multiply see earlier error message!\n");
  }

  del( foo, 3 );
  del( bar, 3 );

  return 0;
}
#包括
#包括
#包括
/*为了与C兼容,请将此方法替换为printf版本*/
无效打印(双**垫,整数x,整数y)
{
int r,c;
对于(r=0;rstd::cout在矩阵A和B相乘之前,检查矩阵A的行长和矩阵B的列长是否相等。

矩阵分配
返回一个单位矩阵而不是零矩阵可能比较方便。为此,请将循环有效负载更改为

            matrix[i][j] = i==j? 1: 0;

返回值为0表示矩阵的所有成员都为0,或者MatrixMultiplication的matrixC输出为空?这里有一个错误:
for(int k=0;k
,应该是
k
(或者
sizeYA
)。但这不应表现为总是得到0。您不需要在C程序中强制转换
malloc
的返回值。正如预期的那样,在这里使用一个简单的示例。问题最有可能出现在调用代码中。分别分配每一行(或列)(加上一个指针数组)不是很有效。在一个矩阵中分配整个矩阵似乎更好。使用malloc(sizeXsizeYsizeof(double))分配一个。分配和释放更容易、更有效。+1对于一个完整的程序。但是,你能用OP使用的语言编写你的解决方案吗?我欣赏这种感觉并理解(这就是为什么我不使用真正的C++函数)。我做的唯一非C的事情是打印方法,它不是问题的核心。虽然C99引入了对bool的支持,但我会更新该部分。如果其他人想编辑我的打印方法以使用printf,这对我来说是很好的。我只是很久没有使用printf了。我会准备好其余的部分。谢谢sepideh,我想了这个,但忘了我最初,你的帖子提醒我将其纳入我的代码中。