C中的矩阵乘法误差

时间:2013-12-15 02:16:49

标签: c matrix matrix-multiplication

我一直在研究一些使用C实现离散余弦变换的代码。这是我用于矩阵乘法的代码。

float Yt[8][8][4];
float Y8[8][8][4]={{{0.980785,-0.555570,0.555570 ...}}};
float A[8][8]={{0.707107,0.707107 ... }};

for(k=0;k<4;++k){
        for(i=0;i<8;++i){
            for(j=0;j<8;++j){
            Yt[i][j][k]=0;
            }}}

for(k=0;k<4;++k){
    for(i=0;i<8;++i){
         for(j=0;j<8;++j){
            for(l=0;l<8;++l){
                Yt[i][j][k]+=A[i][l]*Y8[l][j][k];
                }}}}

Y8是相同的8x8矩阵,重复4次。 我的代码成功编译并运行。但是,我收到的输出显然是不正确的。 Yt[i][j][k] for k=0,1,2,3应该都是相同的值,但我最终得到k = 0,1的正确值和k = 2,3的不同值。

任何人都可以看到为什么我得到的最后两个矩阵的值不正确?

2 个答案:

答案 0 :(得分:1)

初始化Yt[i][j][k]

我怀疑这将按以下方式完成

for(j=0;j<8;++j){
  Yt[i][j][k] = 0.0;
  for(l=0;l<8;++l){
    Yt[i][j][k] += A[i][l]*Y8[l][j][k];
  }
}

......或在其声明中。像double Yt[8][8][4] = { 0.0 };

这样的东西

答案 1 :(得分:1)

@chux在使用它之前很好地调用了Yt的值。你可能会这样做:

for(k=0;k<4;++k){
  for(i=0;i<8;++i){
    for(j=0;j<8;++j){
      double temp = 0.0;
      for(l=0;l<8;++l){
        temp += A[i][l]*Y8[l][j][k];
      }
      Yt[i][j][k] = temp;
    }
  }
}

这将允许编译器使用寄存器进行累积,然后只访问Yt(带有三个索引操作)。