203号居民 2023-09-08 14:23 采纳率: 75%
浏览 3
已结题

csp认证JPEG 解码 问题提问

#202212-3 JPEG 解码题目问题

目前已经可以拿到40分,在离散余弦变化时按照题目条件进行计算,和网上满分代码对比也大致相同,但输出就是有问题(这里

我只输出了经过变化后没有+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;
}

输出结果如下:

img


官网结果如下:

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-08 17:01
    关注

    【以下回答由 GPT 生成】

    问题描述中没有提到具体的输出问题,所以无法确定需要优化的具体部分。但从代码中可以看出,read_scan_data_1函数是用来填充图像矩阵的,可能出错的地方可能在于对于q[x][y]m[dx][dy]的赋值。以下是我的优化建议:

    1. 首先,你可以在函数前面添加注释,说明函数的具体作用和输入输出,以及对应的数据格式。

    c++ /** * @brief 从给定的data数组中填充图像矩阵q和m * @param n: data数组的大小 * @return 无 */ void read_scan_data_1(int n) { // ... }

    1. idx数组的定义上方,添加注释解释该数组的作用和含义。

    c++ /** * @brief q和m矩阵坐标索引对应data数组的索引 */ int idx[8][8] = { // ... };

    1. 在代码中通过适当的注释,解释一些关键变量和计算的含义,使得代码更加易懂。

    2. 进行输入的检查,确保输入的大小和格式符合要求。

    ```c++ void read_scan_data_1(int n) { if (n != 64) { // 输入数据大小错误,抛出异常或返回错误代码 return; }

       // ...
    

    } ```

    1. 检查赋值语句的正确性,尤其是对于data数组和qm矩阵的索引。

    ```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];
       }
    
       // ...
    

    } ```

    请根据以上建议进行代码优化,并在出现错误时进行适当的异常处理或错误代码返回。如果以上优化不能解决问题,请提供更具体的问题描述。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月24日
  • 已采纳回答 9月16日
  • 创建了问题 9月8日

悬赏问题

  • ¥15 微信小程序 前端页面内容搜索
  • ¥15 cpu是如何判断当前指令已经执行完毕,然后去执行下条指令的
  • ¥15 C++Codeinject远线程注入
  • ¥15 安装visual studio2022时visualstudiosetup启动不了,闪退。问题代号0x0和0x1389
  • ¥30 java spring boot2.5.3版本websocket连不上
  • ¥15 angular js调外部链接查看pdf
  • ¥15 openFOAM DPMFoam
  • ¥15 将查询到的值,赋值到table指定行中
  • ¥50 docker容器内部启动shell脚本多命令
  • ¥15 请问python的selenium怎么设置referer