?? mathmetric.cpp
字號:
// MathMetric.cpp: implementation of the MathMetric class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BiShe.h"
#include "MathMetric.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/**********************************************************
函數名:foo
功能:定義此函主要是為了讓模板具現化
入口參數:無
出口參數:無
說明:該函數必須調用類中所有的公共函數甚至是么有函數,否則
在編譯過程中將出錯
**********************************************************/
MathMetric::MathMetric()
{
}
/**********************************************************
函數名:foo
功能:定義此函主要是為了讓模板具現化
入口參數:無
出口參數:無
說明:該函數必須調用類中所有的公共函數甚至是么有函數,否則
在編譯過程中將出錯
**********************************************************/
MathMetric::MathMetric(double*data,unsigned int line,unsigned int clum)
{
this->line=line;
this->clum=clum;
this->data=(double*)malloc(sizeof(double)*line*clum);
if(!this->data)
return;
memcpy((void*)this->data,(void*)data,sizeof(double)*line*clum);
}
/**********************************************************
函數名:foo
功能:定義此函主要是為了讓模板具現化
入口參數:無
出口參數:無
說明:該函數必須調用類中所有的公共函數甚至是么有函數,否則
在編譯過程中將出錯
**********************************************************/
MathMetric::~MathMetric()
{
free(data);
}
/**********************************************************
函數名:foo
功能:定義此函主要是為了讓模板具現化
入口參數:無
出口參數:無
說明:該函數必須調用類中所有的公共函數甚至是么有函數,否則
在編譯過程中將出錯
**********************************************************/
/*void foo()
{
MathMetric aa;
aa.multiple(NULL,1,1,NULL,1,1);
aa.devide(NULL,1,1,NULL,1,1);
aa.add(NULL,1,1,NULL,1,1);
aa.sub(NULL,1,1,NULL,1,1);
aa.Inverse(NULL,1);
}*/
/**********************************************************
函數名:Rotate
功能:以圖片中心為原點旋轉X度
入口參數:doAngle:旋轉度數
出口參數:無
說明:函數中計算f1,f2是因為旋轉是以圖片中心進行的,但實際的算法
卻是以圖片的左上角為原點進行,所以這樣處理以后需要將圖片
平移(f2,f1)
**********************************************************/
double* MathMetric::add(double* metric1,unsigned int dim1,unsigned int dim2,double* metric2,unsigned int dim3,unsigned int dim4)
{
double* temp;
double* result;
if((dim1!=dim3)&&(dim2!=dim4))
{
AfxMessageBox("兩矩陣維數不匹配!!!不能相加");
return NULL;
}
result=(double*)malloc(dim1*dim2*sizeof(double));
ASSERT(result);
temp=result;
memset(result,0,dim1*dim2*sizeof(double));
for(unsigned int i=0;i<dim1*dim2;i++)
{
*result++=*metric1+++*metric2++;
}
return temp;
}
/**********************************************************
函數名:Rotate
功能:以圖片中心為原點旋轉X度
入口參數:doAngle:旋轉度數
出口參數:無
說明:函數中計算f1,f2是因為旋轉是以圖片中心進行的,但實際的算法
卻是以圖片的左上角為原點進行,所以這樣處理以后需要將圖片
平移(f2,f1)
**********************************************************/
double* MathMetric::sub(double* metric1,unsigned int dim1,unsigned int dim2,double* metric2,unsigned int dim3,unsigned int dim4)
{
double* temp;
double* result;
if((dim1!=dim3)&&(dim2!=dim4))
{
AfxMessageBox("兩矩陣維數不匹配!!!");
return NULL;
}
result=(double*)malloc(dim1*dim2*sizeof(double));
ASSERT(result);
temp=result;
memset(result,0,dim1*dim2*sizeof(double));
for(unsigned int i=0;i<dim1*dim2;i++)
*result++=*metric1++-*metric2++;
return temp;
}
/**********************************************************
函數名:Rotate
功能:以圖片中心為原點旋轉X度
入口參數:doAngle:旋轉度數
出口參數:無
說明:函數中計算f1,f2是因為旋轉是以圖片中心進行的,但實際的算法
卻是以圖片的左上角為原點進行,所以這樣處理以后需要將圖片
平移(f2,f1)
**********************************************************/
double* MathMetric::multiple(double* metric1,unsigned int dim1,unsigned int dim2,double* metric2,unsigned int dim3,unsigned int dim4)
{
double* temp;
double* result;
if(dim2!=dim3)
{
AfxMessageBox("兩矩陣維數不匹配!!!");
return NULL;
}
result=(double*)malloc(dim1*dim4*sizeof(double));
ASSERT(result);
temp=result;
memset(result,0,dim1*dim4*sizeof(double));
for(unsigned int j=0;j<dim1;j++)
for(unsigned int k=0;k<dim4;k++)
{
for(unsigned int i=0;i<dim2;i++)
{
*result+=(metric1[j*dim2+i]*metric2[i*dim4+k]);
}
result++;
}
return temp;
}
/**********************************************************
函數名:devide
功能:以圖片中心為原點旋轉X度
入口參數:doAngle:旋轉度數
出口參數:無
說明:函數中計算f1,f2是因為旋轉是以圖片中心進行的,但實際的算法
卻是以圖片的左上角為原點進行,所以這樣處理以后需要將圖片
平移(f2,f1)
**********************************************************/
double* MathMetric::devide(double* metric1,unsigned int dim1,unsigned int dim2,double* metric2,unsigned int dim3,unsigned int dim4)
{
if((dim1!=dim3)&&(dim2!=dim4))
{
AfxMessageBox("兩矩陣維數不匹配!!!");
}
double* result=(double*)malloc(dim1*dim4*sizeof(double));
ASSERT(result);
memset(result,0,dim1*dim4*sizeof(double));
return result;
}
/**********************************************************
函數名:reverse
功能:求矩陣的轉置矩陣
入口參數:無
出口參數:成功返回true,失敗返回false
說明:僅有方正才有轉置矩陣
**********************************************************/
bool MathMetric::reverse(double *data, unsigned int line, unsigned int colum)
{
unsigned int i;
unsigned int n;
unsigned temp;
unsigned temp1;
i=0;
n=0;
temp=0;
temp1=0;
if(line!=colum)
return false;
for(i=0;i<line;i++)
for(n=i+1;n<colum;n++)
{
temp=i*colum+n;
temp1=n*colum+i;
data[temp]+=data[temp1];
data[temp1]=data[temp]-data[temp1];
data[temp]-=data[temp1];
}
return true;
}
/**********************************************************
函數名:inverse
功能:求矩陣的逆
入口參數:a:矩陣的無素數組的指針,其按行按列存放在一維數組中
n:矩陣的維數
出口參數:如果矩陣有逆則返回真,否則返回假
說明:只有方陣才有其逆矩陣
**********************************************************/
bool MathMetric::inverse(double* a,int n)
{
int *is,*js,i,j,k,l,u,v;
double d,p;
is=(int*)malloc(n*sizeof(int));
js=(int*)malloc(n*sizeof(int));
for (k=0; k<=n-1; k++)
{ d=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{
l=i*n+j;
p=fabs(a[l]);
if (p>d)
{
d=p;
is[k]=i;
js[k]=j;
}
}
if (d+1.0==1.0)
{
free(is);
free(js);
AfxMessageBox("該矩陣無逆陣。\n");
return(false);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -