A = mxCreateDoubleMatrix(M, N, mxREAL);mxDestroyArray(A);

本文介绍了一个使用MATLAB API进行矩阵QR分解的MEX文件实现。该程序首先显示输入矩阵,然后调用MATLAB的内置qr函数进行分解,并输出得到的Q和R矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <string.h>
#include "mex.h"
void DisplayMatrix(char *Name, double *Data, int M, int N)
{ /* Display matrix data */
	int m, n;
	mexPrintf("%s = \n", Name);
	for(m = 0; m < M; m++, mexPrintf("\n"))
		for(n = 0; n < N; n++)
			mexPrintf("%8.4f ", Data[m + M*n]);
}

void CallQR(double *Data, int M, int N)
{ /* Perform QR factorization by calling the MATLAB function */
	mxArray *Q, *R, *A;
	mxArray *ppLhs[2];
	DisplayMatrix("Input", Data, M, N);
	A = mxCreateDoubleMatrix(M, N, mxREAL); /* Put input in an mxArray */
	memcpy(mxGetPr(A), Data, sizeof(double)*M*N);
	mexCallMATLAB(2, ppLhs, 1, &A, "qr"); /* Call MATLAB's qr function */
	Q = ppLhs[0];
	R = ppLhs[1];
	DisplayMatrix("Q", mxGetPr(Q), M, N);
	DisplayMatrix("R", mxGetPr(R), M, N);
	mxDestroyArray(R); /* No longer need these */
	mxDestroyArray(Q);
	mxDestroyArray(A);
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
#define M_IN prhs[0]
	if(nrhs != 1 || mxGetNumberOfDimensions(M_IN) != 2 || !mxIsDouble(M_IN))
		mexErrMsgTxt("Invalid input.");
	CallQR(mxGetPr(M_IN), mxGetM(M_IN), mxGetN(M_IN));
}

#include <QDebug> #include <QStringList> #include "mainwindow.h" #include "ui_mainwindow.h" #include "mat_fit.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); mat_fitInitialize(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { int i; double *arr = nullptr; QString res; QStringList x = ui->lineEdit->text().split(" "); QStringList y = ui->lineEdit_2->text().split(" "); if(x.size() != y.size()) { ui->textEdit->append(QString("x y坐标长度不相等")); } else if(x.size() < 2 || y.size() < 2) { ui->textEdit->append(QString("请输入最少两个点")); } else { mwArray in_x(1,x.size(),mxDOUBLE_CLASS,mxREAL); mwArray in_y(1,y.size(),mxDOUBLE_CLASS,mxREAL); mwArray out_a(1,1,mxDOUBLE_CLASS,mxREAL); mwArray out_b(1,1,mxDOUBLE_CLASS,mxREAL); mwArray out_r(1,1,mxDOUBLE_CLASS,mxREAL); arr = (double *)malloc(x.size() * sizeof(double)); if(arr == nullptr) { ui->textEdit->append("内存申请错误"); goto exit; } for(i = 0;i < x.size(); i++) { arr[i] = QString(x[i]).toDouble(); } in_x.SetData(arr,x.size()); for(i = 0;i < y.size(); i++) { arr[i] = QString(y[i]).toDouble(); } in_y.SetData(arr,y.size()); mat_fit(3,out_a,out_b,out_r,in_x,in_y); out_a.GetData(arr,1); out_b.GetData(arr + 1,1); out_r.GetData(arr + 2,1); res = QString("y = %1 * x + %2 rsquare = %3").arg(QString::number(arr[0],'f',6)) .arg(QString::number(arr[1],'f',6)) .arg(QString::number(arr[2],'f',6)); ui->textEdit->append(res); } exit: if(arr != nullptr) { free(arr); } } 请于这个代码为例子,教会我如何调用外部库(自己从Matlab中生成的库)
最新发布
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值