我一直在研究一些使用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的不同值。
任何人都可以看到为什么我得到的最后两个矩阵的值不正确?
答案 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
(带有三个索引操作)。