☰
C++代码实现MATLAB中的tfdata函数功能
2026/9/28 4:38:57 网站建设 项目流程
#include<iostream>#include<vector>#include<string>#include<stdexcept>#include<cassert>// ---------------------------------------------------------------------------// CellArray: 轻量级模拟 MATLAB 元胞数组// 支持二维索引 (行=输出, 列=输入),每个元素为 vector<double> (系数行向量)// ---------------------------------------------------------------------------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(auto&row:data_)row.resize(c);}// 访问元素 (可读写)std::vector<double>&at(size_t i,size_t j){returndata_.at(i).at(j);}conststd::vector<double>&at(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::vector<std::vector<std::vector<double>>>data_;};// ---------------------------------------------------------------------------// TransferFunction: 传递函数模型// 支持 SISO 与 MIMO 两种存储方式,系数均按降幂排列// ---------------------------------------------------------------------------classTransferFunction{public:// SISO 构造函数TransferFunction(conststd::vector<double>&num,conststd::vector<double>&den,doublesampleTime=0.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::vector<std::vector<std::vector<double>>>&numMIMO,conststd::vector<std::vector<std::vector<double>>>&denMIMO,doublesampleTime=0.0):ts_(sampleTime),isMIMO_(true){if(numMIMO.empty()||denMIMO.empty())throwstd::invalid_argument("MIMO numerator/denominator arrays must be non-empty.");size_t rows=numMIMO.size();size_t cols=numMIMO[0].size();if(denMIMO.size()!=rows||denMIMO[0].size()!=cols)throwstd::invalid_argument("Numerator and denominator dimensions mismatch.");for(size_t i=0;i<rows;++i){for(size_t j=0;j<cols;++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::vector<double>&numeratorSISO()const{if(isMIMO_)throwstd::logic_error("Not a SISO model.");returnnumSISO_;}conststd::vector<double>&denominatorSISO()const{if(isMIMO_)throwstd::logic_error("Not a SISO model.");returndenSISO_;}conststd::vector<std::vector<std::vector<double>>>&numeratorMIMO()const{if(!isMIMO_)throwstd::logic_error("Not a MIMO model.");returnnumMIMO_;}conststd::vector<std::vector<std::vector<double>>>&denominatorMIMO()const{if(!isMIMO_)throwstd::logic_error("Not a MIMO model.");returndenMIMO_;}private:std::vector<double>numSISO_,denSISO_;std::vector<std::vector<std::vector<double>>>numMIMO_,denMIMO_;doublets_;boolisMIMO_;};// ---------------------------------------------------------------------------// tfdata: 模拟 MATLAB 的 tfdata 函数// 输入:// sys - 传递函数模型// numOut - 输出: 分子元胞数组// denOut - 输出: 分母元胞数组// tsOut - 输出: 采样时间// vectorMode - 是否使用 'v' 选项 (仅对 SISO 有效)// ---------------------------------------------------------------------------voidtfdata(constTransferFunction&sys,CellArray&numOut,CellArray&denOut,double&tsOut,boolvectorMode=false){tsOut=sys.sampleTime();if(sys.isMIMO()){// --- MIMO 情况 ---constauto&numMIMO=sys.numeratorMIMO();constauto&denMIMO=sys.denominatorMIMO();size_t rows=numMIMO.size();size_t cols=numMIMO[0].size();numOut=CellArray(rows,cols);denOut=CellArray(rows,cols);for(size_t i=0;i<rows;++i){for(size_t j=0;j<cols;++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) 获取向量)numOut=CellArray(1,1);denOut=CellArray(1,1);numOut.at(0,0)=sys.numeratorSISO();denOut.at(0,0)=sys.denominatorSISO();}else{// 默认模式: 返回 1x1 元胞数组 (模拟 MATLAB 行为)numOut=CellArray(1,1);denOut=CellArray(1,1);numOut.at(0,0)=sys.numeratorSISO();denOut.at(0,0)=sys.denominatorSISO();}}}// ---------------------------------------------------------------------------// 辅助函数: 打印 vector<double>// ---------------------------------------------------------------------------voidprintVector(conststd::vector<double>&vec){std::cout<<"[";for(size_t i=0;i<vec.size();++i){std::cout<<vec[i];if(i+1<vec.size())std::cout<<", ";}std::cout<<"]";}// 辅助函数: 打印 CellArray (按 MATLAB 风格显示)voidprintCellArray(constCellArray&cell,conststd::string&name){std::cout<<name<<" = "<<std::endl;if(cell.empty()){std::cout<<" []"<<std::endl;return;}for(size_t i=0;i<cell.rows();++i){for(size_t j=0;j<cell.cols();++j){std::cout<<" {"<<(i+1)<<","<<(j+1)<<"} = ";printVector(cell.at(i,j));std::cout<<std::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::cout<<"ts = "<<ts<<std::endl;std::cout<<"\n===== 测试 1b: SISO 'v' 模式 ====="<<std::endl;tfdata(sysSISO,numCell,denCell,ts,true);std::cout<<"num = ";printVector(numCell.at(0,0));std::cout<<std::endl;std::cout<<"den = ";printVector(denCell.at(0,0));std::cout<<std::endl;std::cout<<"ts = "<<ts<<std::endl;// ================================================================// 测试 2: MIMO 传递函数 (2 输出 x 2 输入)// H(1,1) = 1/(s+1), H(1,2) = 2/(s+2)// H(2,1) = 3/(s+3), H(2,2) = 4/(s+4)// ================================================================std::cout<<"\n===== 测试 2: MIMO 默认模式 ====="<<std::endl;// 构造 MIMO 系数数组std::vector<std::vector<std::vector<double>>>numMIMO={{{1.0},{2.0}},// 输出 1 的分子{{3.0},{4.0}}// 输出 2 的分子};std::vector<std::vector<std::vector<double>>>denMIMO={{{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::cout<<"ts = "<<ts<<std::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::cout<<"num = ";printVector(numCell.at(0,0));std::cout<<std::endl;std::cout<<"den = ";printVector(denCell.at(0,0));std::cout<<std::endl;std::cout<<"ts = "<<ts<<std::endl;return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询