ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

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

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;}
返回列表