📄 jpeg.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 + -