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

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][b]=c[a][b];
		}
	}
	
//----提取列--------------------不能用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[b][a]=c[a][b];
		}
	}
	
	
//----提取块--------------------------
	
	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[b][a]=d[a][b];
		}
	}
	
	
	
	//----------显示--------------------
	for(int a=0;a<4;a++){
		for(int b=0;b<4;b++){
			printf("%d,",o_z[a][b] );
		}
		puts("");
	}
	
	
	return 0;
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值