博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC矩阵运算
阅读量:4096 次
发布时间:2019-05-25

本文共 8398 字,大约阅读时间需要 27 分钟。

1,对话框文件

2,图形

3,源码

// VarianceDlg.cpp : 实现文件#include "stdafx.h"#include "Variance.h"#include "VarianceDlg.h"#include "afxdialogex.h"#include 
#include
#include "Eigen/Eigenvalues"#ifdef _DEBUG#define new DEBUG_NEW#endif#include
#include
using namespace Eigen; // 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX };protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现protected: DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){ CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CVarianceDlg 对话框CVarianceDlg::CVarianceDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CVarianceDlg::IDD, pParent) , m_input(_T("")) , m_output(_T("")){ m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);}void CVarianceDlg::DoDataExchange(CDataExchange* pDX){ CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT4, m_input); DDX_Text(pDX, IDC_EDIT3, m_output);}BEGIN_MESSAGE_MAP(CVarianceDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CVarianceDlg::OnBnClicked_save_A) ON_BN_CLICKED(IDC_BUTTON2, &CVarianceDlg::OnBnClicked_Cov) ON_BN_CLICKED(IDC_BUTTON3, &CVarianceDlg::OnBnClicked_S) ON_BN_CLICKED(IDC_BUTTON4, &CVarianceDlg::OnBnClickeddet) ON_BN_CLICKED(IDC_BUTTON5, &CVarianceDlg::OnBnClickedButton_dets) ON_BN_CLICKED(IDC_BUTTON6, &CVarianceDlg::OnBnClicked_adjoint) ON_BN_CLICKED(IDC_BUTTON7, &CVarianceDlg::OnBnClicked_inverse) ON_BN_CLICKED(IDC_BUTTON8, &CVarianceDlg::OnBnClicked_R) ON_BN_CLICKED(IDC_BUTTON9, &CVarianceDlg::OnBnClicked_save_B) ON_BN_CLICKED(IDC_BUTTON10, &CVarianceDlg::OnBnClicked_AB) ON_BN_CLICKED(IDC_BUTTON11, &CVarianceDlg::OnBnClicked_Cramer) ON_BN_CLICKED(IDC_BUTTON12, &CVarianceDlg::OnBnClicked_Jacobi) ON_BN_CLICKED(IDC_BUTTON13, &CVarianceDlg::OnBnClicked_Clear_out) ON_BN_CLICKED(IDC_BUTTON14, &CVarianceDlg::OnBnClicked_Gauss_Seidel) ON_BN_CLICKED(IDC_BUTTON15, &CVarianceDlg::OnBn_Eigen) ON_COMMAND(ID_32771, &CVarianceDlg::Onmenu_data) ON_COMMAND(ID_AX_DATA, &CVarianceDlg::OnAx_B_data) ON_COMMAND(ID_ABOUT_ABOUT, &CVarianceDlg::OnAboutAbout) ON_BN_CLICKED(IDC_BUTTON16, &CVarianceDlg::but_PCA) ON_COMMAND(ID_PCA_DATA, &CVarianceDlg::Menu_PcaData)END_MESSAGE_MAP()// CVarianceDlg 消息处理程序BOOL CVarianceDlg::OnInitDialog(){ CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 row=0; column=0; return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}void CVarianceDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); }}// 如果向对话框添加最小化按钮,则需要下面的代码// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,// 这将由框架自动完成。void CVarianceDlg::OnPaint(){ if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast
(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); }}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR CVarianceDlg::OnQueryDragIcon(){ return static_cast
(m_hIcon);}// TODO: 在此添加控件通知处理程序代码#####################################//文件变量定义void CVarianceDlg::OnBnClicked_Clear_out(){ m_output=""; UpdateData(FALSE); //print}void CVarianceDlg::OnBnClicked_save_A(){ UpdateData(TRUE); //READ row=0; column=0; int max=0; m_input.Replace("\r\n", " # "); //回车换成字符# char *p = strtok((LPSTR)(LPCSTR)m_input," \t\n"); //使用' '和'\t'来分割字符串 line,当前 p 的值为类别 if(p != NULL) column++; else { MessageBox(" Please input matrix_A ! "); return; } bool flag=true; while(1) { p = strtok(NULL," \t"); if( p == NULL) //最后一行 { if(column>0&&flag==true)//1 行 且没遇到换行 { row=1; max=column; MessageBox("only one line "); break; } else if(max==column&&flag==false) //最后一个数量合适 { row++; break; } else if(column==0&&flag==false) //column==0说明回车后面是空行,此时停止读数 { break; MessageBox("last line ");// } else if(flag==false&&max!=column) { temp.Format("wrong in %d row",row+1); MessageBox(temp); return; } } if( *p == '#') // 换行 { if(max>0&&column==0)//空行 { break; } if(max>0&&max!=column) { temp.Format("wrong in %d row",row+1); MessageBox(temp); return; } if(flag) max=column; flag=false; row++; column=0; } else { column++; //非空列加1 } } column=max; save();}void CVarianceDlg::save(){ UpdateData(TRUE); //READ char *endptr; int i=0, j=0; CString str; matrix_A= new double[row*column]; //yiwei prow= new double*[row]; /二维数据 //m_output=m_input; /* temp.Format("r=%d,c=%d ",row,column); MessageBox(temp);*/ m_input.Replace("\r\n", " # "); bool flag =true; for(i=0;i
0&&flag==true)//1 行 且没遇到换行 { row_b=1; max=column_b; MessageBox("only one line "); break; } else if(max==column_b&&flag==false) //最后一个数量合适 { row_b++; break; } else if(column_b==0&&flag==false) //column==0说明回车后面是空行,此时停止读数 { break; MessageBox("last line ");// } else if(flag==false&&max!=column_b) { temp.Format("wrong in %d row_b",row_b+1); MessageBox(temp); return; } } if( *p == '#') // 换行 { if(max>0&&column_b==0)//空行 { break; } if(max>0&&max!=column_b) { temp.Format("wrong in %d row_b",row_b+1); MessageBox(temp); return; } if(flag) max=column_b; flag=false; row_b++; column_b=0; } else { column_b++; //非空列加1 } } column_b=max; save_B();}void CVarianceDlg::save_B(){ UpdateData(TRUE); //READ char *endptr; int i=0, j=0; CString str; matrix_B= new double[row_b*column_b]; prow_b= new double*[row_b]; //m_output=m_input; /* temp.Format("r=%d,c=%d ",row_b,column_b); MessageBox(temp);*/ m_input.Replace("\r\n", " # "); bool flag =true; for(i=0;i
bi) //ai行的代数余子式是:小于ai的行,aa与bb阵,同行赋值 p=0; else p=1; //大于等于ai的行,取aa阵的ai+1行赋值给阵bb的bi行 for(int j=0;j
bi) //ai行的代数余子式是:小于ai的行,aa与bb阵,同行赋值 pi=0; else pi=1; //大于等于ai的行,取aa阵的ai+1行赋值给阵bb的bi行 if(aj>bj) //ai行的代数余子式是:小于ai的行,aa与bb阵,同行赋值 pj=0; else pj=1; //大于等于ai的行,取aa阵的ai+1行赋值给阵bb的bi行 bb[bi*(n-1)+bj]=aa[(bi+pi)*n+bj+pj]; } } if((ai+aj)%2==0) q=1;//因为列数为0,所以行数是偶数时候,代数余子式为-1. else q=(-1); padjoint[ai*n+aj]=q*det(n-1,bb); //加符号变为代数余子式 } } delete []bb;}void CVarianceDlg::OnBnClicked_adjoint(){ if(column!=row) { MessageBox("行列不相等,无法计算"); return ; } adjoint(row,matrix_A); 计算 m_output+="\r\n伴随阵: \r\n"; for(int ai=0;ai
es(A); std::ostringstream os; std::string temp; os<< "The eigenvalues of A are:\r\n" << es.eigenvalues() << std::endl; temp=os.str(); m_output=temp.c_str(); m_output.Replace( "(", "\t"); //回车换成字符# std::ostringstream os2; os2<< "The eigenvectors of A are:\r\n" <
<< std::endl; temp=os2.str(); m_output+=temp.c_str(); m_output.Replace("\n", "\r\n"); m_output.Replace( "(" , " " ); m_output.Replace(",0)", "\t"); //有复数的情况 m_output.Replace(",-", " - "); m_output.Replace(",", " + "); m_output.Replace(")", " i"); UpdateData(FALSE); //print}void CVarianceDlg::Onmenu_data(){ // TODO: 在此添加命令处理程序代码 m_input="1 2 3\r\n4 5 6\r\n7 8 9"; UpdateData(FALSE); //print}void CVarianceDlg::OnAx_B_data(){ // TODO: 在此添加命令处理程序代码 m_input="8 -3 2 20 \r\n4 11 -1 33 \r\n2 1 4 12"; UpdateData(FALSE); //print}void CVarianceDlg::OnAboutAbout(){ // TODO: 在此添加命令处理程序代码 CAboutDlg dlg; dlg.DoModal(); }void CVarianceDlg::but_PCA(){ // TODO: 在此添加控件通知处理程序代码}void CVarianceDlg::Menu_PcaData(){ // TODO: 在此添加命令处理程序代码m_input="37.115 33.069 24.631 12.364 2.695 11.155 7.367 12.597\r\n\33.069 31.314 22.624 11.506 2.593 11.177 7.075 11.911\r\n\24.631 22.624 19.739 7.119 1.217 6.163 4.030 9.322\r\n\12.364 11.506 7.119 7.131 1.575 5.334 3.229 3.573\r\n\2.695 2.593 1.217 1.575 4.437 7.013 2.084 0.577\r\n\11.155 11.177 6.163 5.334 7.013 30.784 7.472 4.049\r\n\7.367 7.075 4.030 3.229 2.084 7.472 7.554 2.340\r\n\12.597 11.911 9.322 3.573 0.577 4.049 2.340 9.246\r\n"; UpdateData(FALSE); //print}
你可能感兴趣的文章
MySQL的索引
查看>>
今天,Python信息量很大!
查看>>
Flash 已死,Deno 当立?
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
都无代码了,还要程序员吗?
查看>>
程序员:凭自己能力吃饭,有什么理由瞧不起?
查看>>
面试想拿 10K,HR 说我只配7k?
查看>>
副业过万的程序员都知道的网站有哪些
查看>>
那些人生“开挂”的程序员,都在干什么?
查看>>
影响科学圈的那些计算机代码
查看>>
乐视视频 App 图标改为“欠 122 亿”,网友:我在别家分红包,却在你家随份子!...
查看>>
乔布斯18岁求职信拍卖价22.24万美元,值吗?
查看>>
为何程序员总喜欢写技术博客,看完恍然大悟...
查看>>
假如计算机是中国人发明的,那代码应该这么写
查看>>
科技公司最爱的 50 款开源工具,你都用过吗?
查看>>
触目惊心:比特币到底消耗了多少能源?
查看>>
面试官:简历上敢写技术精通?那我就不客气了!
查看>>
如何判断一家互联网公司要倒闭了?
查看>>
想快速上手机器学习?来看下这个 GitHub 项目!
查看>>