📄 oneinputdlg.cpp
字号:
// OneInputDlg.cpp : implementation file
//
#include "stdafx.h"
#include "matlab调用.h"
#include "OneInputDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COneInputDlg dialog
//-----------------------------------------------------
extern int GetWordPos(int order,char *m_buffer);
extern void GetSubWord(int order,char *m_buffer,char *pszSubWord);
extern void GetArray(double *dArray,char *str,int row,int colum);
//----------------------------------------------------------
COneInputDlg::COneInputDlg(CWnd* pParent /*=NULL*/)
: CDialog(COneInputDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(COneInputDlg)
m_A = _T("");
//}}AFX_DATA_INIT
}
void COneInputDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COneInputDlg)
DDX_Control(pDX, ID_RESULT, m_WndResult);
DDX_Control(pDX, ID_CACULATE, m_Caculate);
DDX_Control(pDX, IDOK, m_OkButton);
DDX_Text(pDX, IDC_EDIT1, m_A);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(COneInputDlg, CDialog)
//{{AFX_MSG_MAP(COneInputDlg)
ON_BN_CLICKED(ID_CACULATE, OnCaculate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COneInputDlg message handlers
BOOL COneInputDlg::OnInitDialog()
{
CDialog::OnInitDialog();
switch(m_iIndex)
{
case 0:
SetWindowText("求逆");
break;
case 1:
SetWindowText("转置");
break;
case 2:
SetWindowText("求行列式的值");
break;
case 3:
SetWindowText("求特征值特征向量");
break;
default:
break;
}
return TRUE;
}
void COneInputDlg::OnCaculate()
{
int i,j;
int iRowA,iColumA;
CIntArray ColumArrayA;
BOOL bStartRow=FALSE;
BOOL bEndWord=TRUE;
CString str;
CString strResult;
mxArray *plhs[2];
double *ArrayA,*ArrayC,*ArrayB;
mxArray *A,*AT,*B,*BT,*C,*CT;
iRowA=iColumA=0;
//-----------------------------------------------------------------------------
UpdateData(TRUE);
//------get row,colum of A,B---------------------------------------------------
if(m_A.GetLength()==0)
{
MessageBox("please input A");
return;
}
for(i=0;i<m_A.GetLength();i++)
{
if(m_A.GetAt(i)!=' '&&m_A.GetAt(i)!='\n')
break;
}
if(i==m_A.GetLength())
{
MessageBox("A is empty ,please input A");
return;
}
m_A.Insert(0,'\n');
if(m_A.GetAt(m_A.GetLength()-1)!='\n')
m_A=m_A+'\n';
//----------------------------------------------------获取A的行数列数---------
for(i=0;i<m_A.GetLength();i++)
{
char s;
s=m_A.GetAt(i);
if(m_A.GetAt(i)==0x0a)
{
bStartRow=FALSE;
continue;
}
if(bStartRow==FALSE&&m_A.GetAt(i)!=' '&&m_A.GetAt(i)!=0x0d)
{
bStartRow=TRUE;
iRowA++;
iColumA=1;
bEndWord=FALSE;
ColumArrayA.Add(iColumA);
continue;
}
if(bStartRow)
{
if(m_A.GetAt(i)==' ')
{
bEndWord=TRUE;
continue;
}
if(bEndWord)
{
iColumA++;
bEndWord=FALSE;
ColumArrayA.SetAt(iRowA-1,iColumA);
}
}
}
for(i=0;i<ColumArrayA.GetSize();i++)//检查每行是否有相同的列
{
if(iColumA!=ColumArrayA.GetAt(i))
{
MessageBox("not every row the same colums in A,\ninput A again!");
return;
}
}
//---------------------------------------------------------------
ArrayA=new double[iRowA*iColumA];
GetArray(ArrayA,(LPSTR)(LPCTSTR)m_A,iRowA,iColumA);
//---------------------------------------------------------------
A=mxCreateDoubleMatrix(iRowA,iColumA,mxREAL);
AT=mxCreateDoubleMatrix(iColumA,iRowA,mxREAL);
memcpy((void *)mxGetPr(AT), (void *)ArrayA, iRowA*iColumA*sizeof(double));
mlxTranspose(1,&A,1,&AT);
//---------------------------------------------------------------
switch(m_iIndex)
{
case 0:
if(iColumA!=iRowA)
{
MessageBox("A的维数不匹配!\n请重新输入!");
break;
}
mlxInv(1,&A,1, &A);
mlxTranspose(1,&A,1,&A);//从CT里面顺序读取
memcpy((void *)ArrayA,(void *)mxGetPr(A) , iRowA*iColumA*sizeof(double));
strResult.Empty();
for(i=0;i<iRowA;i++)
{
for(j=0;j<iColumA;j++)
{
str.Format("%-10.2f ",ArrayA[i*iColumA+j]);
strResult=strResult+str;
}
strResult=strResult+'\n';
}
m_WndResult.SetWindowText(strResult);
break;
case 1:
memcpy((void *)ArrayA,(void *)mxGetPr(A) , iRowA*iColumA*sizeof(double));
strResult.Empty();
for(i=0;i<iColumA;i++)
{
for(j=0;j<iRowA;j++)
{
str.Format("%-10.2f ",ArrayA[i*iRowA+j]);
strResult=strResult+str;
}
strResult=strResult+'\n';
}
m_WndResult.SetWindowText(strResult);
break;
case 2:
if(iColumA!=iRowA)
{
MessageBox("A 的维数不匹配!\n请重新输入!");
break;
}
mxArray *Out;
double *result;
Out=mxCreateDoubleMatrix(1,1,mxREAL);
Out=mlfDet(A);
result=(double *)mxGetPr(Out);
strResult.Format("%-10.2f ",*result);
m_WndResult.SetWindowText(strResult);
break;
case 3:
if(iColumA!=iRowA)
{
MessageBox("A的维数不匹配!\n请重新输入!");
break;
}
C=mxCreateDoubleMatrix(iRowA,iColumA,mxREAL);
CT=mxCreateDoubleMatrix(iColumA,iRowA,mxREAL);
B=mxCreateDoubleMatrix(iRowA,iColumA,mxREAL);
BT=mxCreateDoubleMatrix(iColumA,iRowA,mxREAL);
mlxEig(2,plhs,1, &A);
C=plhs[0];
B=plhs[1];
mlxTranspose(1,&CT,1,&C);//从CT里面顺序读取
mlxTranspose(1,&BT,1,&B);
ArrayC=new double[iRowA*iColumA];
ArrayB=new double[iRowA*iColumA];
memcpy((void *)ArrayC,(void *)mxGetPr(CT) ,iRowA*iColumA*sizeof(double));
memcpy((void *)ArrayB,(void *)mxGetPr(BT) ,iRowA*iColumA*sizeof(double));
strResult.Empty();
strResult="特征向量:\n";
for(i=0;i<iRowA;i++)
{
for(j=0;j<iColumA;j++)
{
str.Format("%-10.2f ",ArrayC[i*iColumA+j]);
strResult=strResult+str;
}
strResult=strResult+'\n';
}
strResult=strResult+"特征值:\n";
for(i=0;i<iRowA;i++)
{
for(j=0;j<iColumA;j++)
{
str.Format("%-10.2f ",ArrayB[i*iColumA+j]);
strResult=strResult+str;
}
strResult=strResult+'\n';
}
m_WndResult.SetWindowText(strResult);
delete []ArrayC;
delete []ArrayB;
mxDestroyArray(B);
mxDestroyArray(C);
mxDestroyArray(BT);
mxDestroyArray(CT);
break;
default:
break;
}
mxDestroyArray(A);
mxDestroyArray(AT);
delete []ArrayA;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -