⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpeg.cpp

📁 数据压缩课程设计的压缩编码实验题目,没有实际用处,只能用于演示变化过程.
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MX	8
const double PI=asin(1)*2.0;
int	*Addx=NULL;

struct MAT
{
	int row,col;
	double **pn;
};
/*************************/
bool	MulMatrix(MAT	a,MAT b,MAT &c)// a*b=c
{
	int i=0,j=0,k=0;
	double ex;
	if(a.col!=b.row){puts("error mul matrix (a,b): row != col");return false;}
	for(i=0;i<a.row;i++){
		for(j=0;j<b.col;j++){
			ex=0.0;
			for(k=0;k<a.col;k++){
				ex += a.pn[i][k] * b.pn[k][j];
			}
			c.pn[i][j]=ex; //printf("%8.3lf ",ex);
		}
		//puts("");
	}
	return true;
}
/*************************/
bool	PutMatrix(MAT a)
{
	int i,j;
	for(i=0;i<a.row;i++){
		for(j=0;j<a.col;j++){
			printf("%9.2lf",a.pn[i][j]);
		}
		printf("\n");
	}
	return true;
}
/*************************/
bool	GenMatrixA(MAT &a,MAT &at,int M)
{
	int i,j;
	double tmp=0.0;
	a.row=M;a.col=M;
	a.pn=(double**)malloc(sizeof(double*)*(a.row));
	at.row=M;at.col=M;
	at.pn=(double**)malloc(sizeof(double*)*(at.row));
	for(i=0;i<at.row;i++)at.pn[i]=(double*)malloc(sizeof(double)*(at.col));
	for(i=0;i<a.row;i++){
		a.pn[i]=(double*)malloc(sizeof(double)*(a.col));
		for(j=0;j<a.col;j++){
			if(i==0)a.pn[i][j]=sqrt(0.5);
			else a.pn[i][j]=1;
			a.pn[i][j]*=sqrt(2.0/M);
			tmp=PI;
			tmp=tmp * (2.0*j+1) * i / (2.0 * M);
			tmp=cos(tmp);
			a.pn[i][j]*=tmp;
			at.pn[j][i]=a.pn[i][j];
		}
	}
	return true;
}
bool	GenAddx(int n)
{
	int i,a=0,n2=n+n;
	Addx=(int*)malloc(sizeof(int)*(n2+1));
	Addx[0]=n2;
	for(i=1;i<=n;i++){
		Addx[i]=i*(i-1)/2;
	}
	for(;i<=n2;i++){
		Addx[i]=Addx[i-1]+n2-i+1;
	}
	return 0;
}

bool	ReadMatrix(MAT &a,MAT &b)
{	
	int i,j;
	FILE	*fp;
	fp=fopen("data.txt","rb");
	if(!fp){puts("Error open file");exit(0);}
	fscanf(fp,"%d%d",&a.row,&a.col);
	a.pn=(double**)malloc(sizeof(double*)*(a.row));
	for(i=0;i<a.row;i++){
		a.pn[i]=(double*)malloc(sizeof(double)*(a.col));
		for(j=0;j<a.col;j++){
			fscanf(fp,"%lf",&a.pn[i][j]);
		}
	}
	fscanf(fp,"%d%d",&b.row,&b.col);
	b.pn=(double**)malloc(sizeof(double*)*(b.row));
	for(i=0;i<b.row;i++){
		b.pn[i]=(double*)malloc(sizeof(double)*(b.col));
		for(j=0;j<b.col;j++){
			fscanf(fp,"%lf",&b.pn[i][j]);
		}
	}
	fclose(fp);
	return true;
}
////////////////////////////
bool	LiangHua(MAT a,MAT Lum,MAT &c)
{
	int i,j,tmp;
	if(a.row!=Lum.row||a.col!=Lum.col)return false;
	for(i=0;i<a.row;i++){
		for(j=0;j<a.col;j++){
			c.pn[i][j]=a.pn[i][j]/Lum.pn[i][j];
			if(c.pn[i][j]>0)c.pn[i][j]+=0.5;
			else c.pn[i][j]-=0.5;
			tmp=int(c.pn[i][j]);
			c.pn[i][j]=tmp;
		}
	}
	return true;
}
///////////////////////////
bool	ScanZZ(MAT a,int Pred)
{
	int i,j,r,c,S=0,N=0;
	double t=0;
	int Num=a.row * a.col;
	printf("DC: %.0f\n",a.pn[0][0]-Pred);
	j=2;
	for(i=1;i<Num;i++){
		if(i>=Addx[j]){
			j++;
			if(j<=MX+1){
				if(c==0){r=r+1;c=0;}
				else {c=c+1;r=0;}
			}
			else {
				if(c==MX-1){r++;}
				else {c++;}
			}
		}//换行
		else{
			if((j-1)%2==0){r++;c--;}
			else {r--;c++;}	 
		}//步进 
		if(i==1){r=0;c=1;}
		//printf("%d %d %d: ZZ(%d,%d)\n",i,j-1,Addx[j],r,c);
		t=a.pn[r][c];
		if(t==0)N++;
		else {
			if(t==1||t==-1)S=1;
			else if(t>=-3&&t<=-2 || t>=2&&t<=3)S=2;
			else if(t>=-7&&t<=-4 || t>=4&&t<=4)S=3;
			else if(t>=-15&&t<=-8 || t>=8&&t<=15)S=4;
			else if(t>=-31&&t<=-16 || t>=16&&t<=31)S=5;
			else if(t>=-63&&t<=-32 || t>=32&&t<=63)S=6;
			else if(t>=-127&&t<=-64 || t>=64&&t<=127)S=7;
			else if(t>=-255&&t<=-128 || t>=128&&t<=255)S=8;
			else if(t>=-511&&t<=-256 || t>=256&&t<=511)S=9;
			else if(t>=-1023&&t<=-512 || t>=512&&t<=1023)S=10;
			else S=11;
			printf("%d/%d\n",N,S);
			N=0;
		}//else
	}//for i
	return true;
}
///////////////////////////
int main()
{
	int i;
	MAT	a,at,b,c,Lum;
	GenAddx(MX);
	//for(i=1;i<=Addx[0];i++)printf("%d ",Addx[i]);puts("");
	GenMatrixA(a,at,MX);	
	//PutMatrix(a);puts("");
	ReadMatrix(b,Lum);
	//PutMatrix(b);puts("");PutMatrix(Lum);puts("");

	c.row=a.row;
	c.col=b.col;
	c.pn=(double**)malloc(sizeof(double*)*(c.row));
	for(i=0;i<c.row;i++)c.pn[i]=(double*)malloc(sizeof(double)*(c.col));
	MulMatrix(a,b,c);
	MulMatrix(c,at,b);
	PutMatrix(b);puts("");
    
	LiangHua(b,Lum,a);

	PutMatrix(a);puts("");
	
	ScanZZ(a,0);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -