#202212-3 JPEG 解码题目问题
我只输出了经过变化后没有+128和取整计算的部分)
代码如下
#include<bits/stdc++.h>
using namespace std;
int q[8][8],m[8][8];
int data[64];
double pi8 = acos(-1)/8.0,m2[8][8];
void read_scan_data_1(int n)
{
//填充图像矩阵方法一:总共只有64个元素,可以直接将走位表直接枚举出来
int idx[8][8] = {{0, 1, 5, 6, 14, 15, 27, 28},
{2, 4, 7, 13, 16, 26, 29, 42},
{3, 8, 12, 17, 25, 30, 41, 43},
{9, 11, 18, 24, 31, 40, 44, 53},
{10, 19, 23, 32, 39, 45, 52, 54},
{20, 22, 33, 38, 46, 51, 55, 60},
{21, 34, 37, 47, 50, 56, 59, 61},
{35, 36, 48, 49, 57, 58, 62, 63}};
for(int i = 0;i < 8;i ++){
for(int j = 0;j < 8;j ++){
m[i][j] = data[idx[i][j]];
}
}
}
void read_scan_data_2(int n)
{
//填充矩阵方法二:找规律版
int i = 0,j = 0,k = 1; //(i,j)为当前方位,k指示前进方向为右上方还是左下方
for(int x = 0;x < n;x ++){
m[i][j] = data[x];
if(k == 1){
//如果向右上方推进,斜对角(左下右上)线两侧的例外分别是i=0和j=7
if(i == 0) j++, k = -1; //注意更改方向
else if(j == 7) i ++,k = -1;
else i --,j ++;
}
else{
//如果向左下方推进,斜对角线两侧的例外分别是i=7和j=0
if(i == 7) j ++, k = 1;
else if(j == 0) i ++, k = 1;
else i ++,j --;
}
}
}
double alpha(int u)
{
if(u == 0) return sqrt(0.5);
else return 1;
}
int cast(int x)
{
if(x < 0) return 0;
if(x > 255) return 255;
return x;
}
int main()
{
for(int i = 0;i < 8;i ++){
for(int j = 0;j < 8;j ++){
cin>>q[i][j];
}
}
int n; cin>>n;
int T; cin>>T;
for(int i = 0;i < n;i ++) cin>>data[i];
//读入填充数据
read_scan_data_2(n);
//量化
for(int i = 0;i < 8;i ++){
for (int j = 0;j < 8;j ++){
m2[i][j] = m[i][j] * q[i][j];
}
}
if(T == 0){
for(int i = 0;i < 8;i ++){
for(int j = 0;j < 8;j ++)
cout<<m[i][j]<<" ";
cout<<endl;
}
}
else if(T == 1){
//输出量化后的矩阵
for(int i = 0;i < 8;i ++){
for (int j = 0;j < 8;j ++){
cout<<m2[i][j]<<" ";
}
cout<<endl;
}
}
else{
for(int i = 0;i < 8;i ++){
for (int j = 0;j < 8;j ++){
double cnt = 0;
for(int u = 0;u < 8;u ++){
for(int v = 0;v < 8;v ++){
double coefficient = alpha(u) * alpha(v);
cnt += coefficient * m2[u][v] * cos(pi8 *(i + 0.5)*u)*cos(pi8 *(j + 0.5)*v);
}
}
//m2[i][j] = cast(round(cnt/4.0 + 128));
m2[i][j] = cnt/4.0;
cout<<m2[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}
输出结果如下:
【以下回答由 GPT 生成】
问题描述中没有提到具体的输出问题,所以无法确定需要优化的具体部分。但从代码中可以看出,read_scan_data_1
函数是用来填充图像矩阵的,可能出错的地方可能在于对于q[x][y]
和m[dx][dy]
的赋值。以下是我的优化建议:
c++ /** * @brief 从给定的data数组中填充图像矩阵q和m * @param n: data数组的大小 * @return 无 */ void read_scan_data_1(int n) { // ... }
idx
数组的定义上方,添加注释解释该数组的作用和含义。c++ /** * @brief q和m矩阵坐标索引对应data数组的索引 */ int idx[8][8] = { // ... };
在代码中通过适当的注释,解释一些关键变量和计算的含义,使得代码更加易懂。
进行输入的检查,确保输入的大小和格式符合要求。
```c++ void read_scan_data_1(int n) { if (n != 64) { // 输入数据大小错误,抛出异常或返回错误代码 return; }
// ...
} ```
data
数组和q
、m
矩阵的索引。```c++ void read_scan_data_1(int n) { // ...
for (int i = 0; i < n; i++) {
int x = i / 8, y = i % 8;
// 检查idx数组的边界问题
if (x >= 8 || y >= 8) {
// 抛出异常或返回错误代码
return;
}
int dx = idx[x][y] / 8, dy = idx[x][y] % 8;
// 检查data数组的边界问题
if (idx[x][y] >= 64) {
// 抛出异常或返回错误代码
return;
}
q[x][y] = data[idx[x][y]] - 128;
m[dx][dy] = q[x][y];
}
// ...
} ```
请根据以上建议进行代码优化,并在出现错误时进行适当的异常处理或错误代码返回。如果以上优化不能解决问题,请提供更具体的问题描述。