打印
[综合信息]

c 总结 二维数组(矩阵)的几种操作

[复制链接]
575|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-1-21 18:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 一维转二维

2,清0

3.行提取

4,列提取

5.块提取

5,矩阵转置

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void){
        u_int8_t a[]={
            0, 1, 2, 3, 4, 5, 6, 7,
                8, 9,10,11,12, 13,14,15,
                16,17,18,19,20,21,22,23,
                24,25,26,27,28,29,30,31
        };
       
//--------转二维数组(矩阵)-----
       
        u_int8_t b[4][8]={};
//        memcpy(b,a,32);            //尽量不用此方法,用二维指针方式
    u_int8_t (*c)[8]=(u_int8_t (*)[8])a;       
       
       
//------矩阵清0--------
    memset(b,0,32);
       
       
//------矩阵提取行--------
       
        memcpy(b,a,32);
        u_int8_t o_h[4][8]={};
       
/*        //方法1--------------------
        for(int a=0;a<4;a++){
                memcpy( &(o_h[a][0]), &(b[a][0]), 8);
        }
*/       
        //方法2-----------------
       
        for(int a=0;a<4;a++){
                for(int b=0;b<8;b++){
                        o_h[a]=c[a];
                }
        }
       
//----提取列--------------------不能用memcpy(),只能一个个提取元素,主要用于1D DCT
       
        u_int8_t o_l[8][4]={};     //8个4元素的数组
       
        for(int b=0;b<8;b++){
                for(int a=0;a<4;a++){
                        o_l[a]=c[a];
                }
        }
       
       
//----提取块--------------------------
       
        u_int8_t o_k[32/4][4]={};        //8个2×2 块,可用于YUV420p 比特流亮度排序
        int kt=0;
        for(int a=0;a<4;a=a+2){
                for(int b=0;b<8;b=b+2){
                       
                        for(int y=0;y<2;y++){
                                for(int x=0;x<2;x++){
                               o_k[kt][2*y+x]=c[a+y][b+x];               
                                }
                        }
                        kt++;
                       
                }
        }
       
//------矩阵转置---------行转为列---------------用于1D DCT
        // 倒置必须行与列数相等
       
        u_int8_t d[4][4]={
                {0,1,2,3},
                {4,5,6,7},
                {8,9,10,11},
                {12,13,14,15}
        };
       
        u_int8_t o_z[4][4]={};
       
        for(int a=0;a<4;a++){
                for(int b=0;b<4;b++){
                        o_z[a]=d[a];
                }
        }
       
       
       
        //----------显示--------------------
        for(int a=0;a<4;a++){
                for(int b=0;b<4;b++){
                        printf("%d,",o_z[a] );
                }
                puts("");
        }
       
       
        return 0;
}

————————————————
版权声明:本文为CSDN博主「乐山劲松」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_59802969/article/details/135726746

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1364

主题

13994

帖子

8

粉丝