新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++代码实现MATLAB中的tfdata函数功能

发布时间:2026/9/28 4:39:01来源:尧图网络
C++代码实现MATLAB中的tfdata函数功能
#includeiostream#includevector#includestring#includestdexcept#includecassert// ---------------------------------------------------------------------------// CellArray: 轻量级模拟 MATLAB 元胞数组// 支持二维索引 (行输出, 列输入)每个元素为 vectordouble (系数行向量)// ---------------------------------------------------------------------------classCellArray{public:CellArray():rows_(0),cols_(0){}// 构造 r x c 的元胞数组每个元素为空 vectorCellArray(size_t r,size_t c):rows_(r),cols_(c){data_.resize(r);for(autorow:data_)row.resize(c);}// 访问元素 (可读写)std::vectordoubleat(size_t i,size_t j){returndata_.at(i).at(j);}conststd::vectordoubleat(size_t i,size_t j)const{returndata_.at(i).at(j);}size_trows()const{returnrows_;}size_tcols()const{returncols_;}boolempty()const{returnrows_0||cols_0;}private:size_t rows_,cols_;std::vectorstd::vectorstd::vectordoubledata_;};// ---------------------------------------------------------------------------// TransferFunction: 传递函数模型// 支持 SISO 与 MIMO 两种存储方式系数均按降幂排列// ---------------------------------------------------------------------------classTransferFunction{public:// SISO 构造函数TransferFunction(conststd::vectordoublenum,conststd::vectordoubleden,doublesampleTime0.0):ts_(sampleTime),isMIMO_(false){if(num.empty()||den.empty())throwstd::invalid_argument(Numerator and denominator must be non-empty.);numSISO_num;denSISO_den;}// MIMO 构造函数// numMIMO[i][j] 为从第 j 个输入到第 i 个输出的分子系数// denMIMO[i][j] 为从第 j 个输入到第 i 个输出的分母系数TransferFunction(conststd::vectorstd::vectorstd::vectordoublenumMIMO,conststd::vectorstd::vectorstd::vectordoubledenMIMO,doublesampleTime0.0):ts_(sampleTime),isMIMO_(true){if(numMIMO.empty()||denMIMO.empty())throwstd::invalid_argument(MIMO numerator/denominator arrays must be non-empty.);size_t rowsnumMIMO.size();size_t colsnumMIMO[0].size();if(denMIMO.size()!rows||denMIMO[0].size()!cols)throwstd::invalid_argument(Numerator and denominator dimensions mismatch.);for(size_t i0;irows;i){for(size_t j0;jcols;j){if(numMIMO[i][j].empty()||denMIMO[i][j].empty())throwstd::invalid_argument(Empty coefficient vector in MIMO array.);}}numMIMO_numMIMO;denMIMO_denMIMO;}boolisMIMO()const{returnisMIMO_;}doublesampleTime()const{returnts_;}conststd::vectordoublenumeratorSISO()const{if(isMIMO_)throwstd::logic_error(Not a SISO model.);returnnumSISO_;}conststd::vectordoubledenominatorSISO()const{if(isMIMO_)throwstd::logic_error(Not a SISO model.);returndenSISO_;}conststd::vectorstd::vectorstd::vectordoublenumeratorMIMO()const{if(!isMIMO_)throwstd::logic_error(Not a MIMO model.);returnnumMIMO_;}conststd::vectorstd::vectorstd::vectordoubledenominatorMIMO()const{if(!isMIMO_)throwstd::logic_error(Not a MIMO model.);returndenMIMO_;}private:std::vectordoublenumSISO_,denSISO_;std::vectorstd::vectorstd::vectordoublenumMIMO_,denMIMO_;doublets_;boolisMIMO_;};// ---------------------------------------------------------------------------// tfdata: 模拟 MATLAB 的 tfdata 函数// 输入:// sys - 传递函数模型// numOut - 输出: 分子元胞数组// denOut - 输出: 分母元胞数组// tsOut - 输出: 采样时间// vectorMode - 是否使用 v 选项 (仅对 SISO 有效)// ---------------------------------------------------------------------------voidtfdata(constTransferFunctionsys,CellArraynumOut,CellArraydenOut,doubletsOut,boolvectorModefalse){tsOutsys.sampleTime();if(sys.isMIMO()){// --- MIMO 情况 ---constautonumMIMOsys.numeratorMIMO();constautodenMIMOsys.denominatorMIMO();size_t rowsnumMIMO.size();size_t colsnumMIMO[0].size();numOutCellArray(rows,cols);denOutCellArray(rows,cols);for(size_t i0;irows;i){for(size_t j0;jcols;j){numOut.at(i,j)numMIMO[i][j];denOut.at(i,j)denMIMO[i][j];}}}else{// --- SISO 情况 ---if(vectorMode){// v 模式: 直接返回行向量用 1x1 元胞数组承载// (调用者可通过 numOut.at(0,0) 获取向量)numOutCellArray(1,1);denOutCellArray(1,1);numOut.at(0,0)sys.numeratorSISO();denOut.at(0,0)sys.denominatorSISO();}else{// 默认模式: 返回 1x1 元胞数组 (模拟 MATLAB 行为)numOutCellArray(1,1);denOutCellArray(1,1);numOut.at(0,0)sys.numeratorSISO();denOut.at(0,0)sys.denominatorSISO();}}}// ---------------------------------------------------------------------------// 辅助函数: 打印 vectordouble// ---------------------------------------------------------------------------voidprintVector(conststd::vectordoublevec){std::cout[;for(size_t i0;ivec.size();i){std::coutvec[i];if(i1vec.size())std::cout, ;}std::cout];}// 辅助函数: 打印 CellArray (按 MATLAB 风格显示)voidprintCellArray(constCellArraycell,conststd::stringname){std::coutname std::endl;if(cell.empty()){std::cout []std::endl;return;}for(size_t i0;icell.rows();i){for(size_t j0;jcell.cols();j){std::cout {(i1),(j1)} ;printVector(cell.at(i,j));std::coutstd::endl;}}}// ---------------------------------------------------------------------------// 主函数: 测试用例// ---------------------------------------------------------------------------intmain(){// // 测试 1: SISO 传递函数 G(s) (2s 3) / (s^2 4s 5)// std::cout 测试 1: SISO 默认模式 std::endl;TransferFunctionsysSISO({2,3},{1,4,5},0.0);CellArray numCell,denCell;doublets;tfdata(sysSISO,numCell,denCell,ts,false);printCellArray(numCell,num);printCellArray(denCell,den);std::coutts tsstd::endl;std::cout\n 测试 1b: SISO v 模式 std::endl;tfdata(sysSISO,numCell,denCell,ts,true);std::coutnum ;printVector(numCell.at(0,0));std::coutstd::endl;std::coutden ;printVector(denCell.at(0,0));std::coutstd::endl;std::coutts tsstd::endl;// // 测试 2: MIMO 传递函数 (2 输出 x 2 输入)// H(1,1) 1/(s1), H(1,2) 2/(s2)// H(2,1) 3/(s3), H(2,2) 4/(s4)// std::cout\n 测试 2: MIMO 默认模式 std::endl;// 构造 MIMO 系数数组std::vectorstd::vectorstd::vectordoublenumMIMO{{{1.0},{2.0}},// 输出 1 的分子{{3.0},{4.0}}// 输出 2 的分子};std::vectorstd::vectorstd::vectordoubledenMIMO{{{1.0,1.0},{1.0,2.0}},// 输出 1 的分母{{1.0,3.0},{1.0,4.0}}// 输出 2 的分母};TransferFunctionsysMIMO(numMIMO,denMIMO,0.1);CellArray numMimoCell,denMimoCell;tfdata(sysMIMO,numMimoCell,denMimoCell,ts,false);printCellArray(numMimoCell,num);printCellArray(denMimoCell,den);std::coutts tsstd::endl;// // 测试 3: 离散 SISO 传递函数// G(z) (z 0.5) / (z^2 - 0.8z 0.15), Ts 0.1// std::cout\n 测试 3: 离散 SISO std::endl;TransferFunctionsysDiscrete({1.0,0.5},{1.0,-0.8,0.15},0.1);tfdata(sysDiscrete,numCell,denCell,ts,true);std::coutnum ;printVector(numCell.at(0,0));std::coutstd::endl;std::coutden ;printVector(denCell.at(0,0));std::coutstd::endl;std::coutts tsstd::endl;return0;}
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

油猴脚本实现多网站多账号一键切换:AnMe实战解析 2026/9/28 5:44:04

油猴脚本实现多网站多账号一键切换:AnMe实战解析

先说我自己的处境:去年接了个内容代运营的活儿,一个人管三个平台,每个平台配两个号。每天最崩溃的不是写稿,而是换号——退出登录、清缓存、重新走验证码,一轮下来少说五分钟。一天光折腾账号就浪费半小时,…

阅读更多 →
基于CNN+LSTM的流量识别系统:从pcap预处理到模型训练完整复现 2026/9/28 5:44:04

基于CNN+LSTM的流量识别系统:从pcap预处理到模型训练完整复现

简介:基于CNN与LSTM的流量分析识别系统完整实现,面向网络人工智能、深度学习与安全分析方向的开发者,能够实时识别正常业务流量、恶意软件流量与网络攻击流量,并对流量随时序的变化进行可视化展示。系统采用CNN提取空间特征、LSTM…

阅读更多 →
GEO生成引擎优化实战:从AI搜索流量机制到落地打法全解析 2026/9/28 5:44:03

GEO生成引擎优化实战:从AI搜索流量机制到落地打法全解析

先说个我最近的真实感受。三月份接了几家 To B 客户的项目复盘,大家碰到的痛点出奇一致:百度来的自然流量还在,但成本越来越贵;谷歌那边被 AI Overview 吞掉了一截点击;更关键的是,企业内部开始追问——当用…

阅读更多 →
AWD攻防实战:一站式多目标托管、权限维持与Flag自动化提交方案 2026/9/28 5:44:03

AWD攻防实战:一站式多目标托管、权限维持与Flag自动化提交方案

上周末打了一场四个小时的AWD,靶机一共五台,刚开局十五分钟,我已经记不清哪台加固过、哪台后门被删了、哪台flag还没提交。等比赛结束复盘,真正浪费时间的不是漏洞分析,而是这些"管理类"杂活。从那次之后我开…

阅读更多 →
避坑指南:2024培训网站建设课程怎么选才不交智商税 2026/9/28 5:44:03

避坑指南:2024培训网站建设课程怎么选才不交智商税

避坑指南:2024培训网站建设课程怎么选才不交智商税 别再对着那些千篇一律的模板网站叹气说“太丑不够用”了。如果你正打算花钱报个培训班,或者自己摸索着搞个像样的网站,这篇避坑指南能帮你省下至少三千块和三个月的时间。很多人觉得建站就是拖拽拖拽…

阅读更多 →
Shell正则表达式实战:核心语法与grep/sed/awk高频用法 2026/9/28 5:43:57

Shell正则表达式实战:核心语法与grep/sed/awk高频用法

写Shell脚本这些年,我越来越觉得正则表达式就是Shell的“文本手术刀”。很多人一提到正则就头大,觉得符号太多记不住,实际上只要抓住几个核心概念,再加上在grep、sed、awk里的实际用法,你就能解决日常开发运维里九成以…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉