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

📄 oneinputdlg.cpp

📁 VC中调用Matlab测试代码混合编程 对于学习VC和MATLAB 很有帮助
💻 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 + -