// d2c.cpp// 完全自包含的 MATLAB d2c (ZOH) 实现// 编译: g -stdc17 -O2 d2c.cpp -o d2c#includeiostream#includeiomanip#includecomplex#includevector#includecmath#includestdexcept#includestringusingcxstd::complexdouble;// // 复数矩阵类行优先扁平化存储// structCMat{introws,cols;std::vectorcxa;CMat():rows(0),cols(0){}CMat(intr,intc):rows(r),cols(c),a(static_castsize_t(r)*c,cx(0.0,0.0)){}cxoperator()(inti,intj){returna[static_castsize_t(i)*colsj];}cxoperator()(inti,intj)const{returna[static_castsize_t(i)*colsj];}staticCMateye(intn){CMatI(n,n);for(inti0;in;i)I(i,i)cx(1.0,0.0);returnI;}};// ----- 基本算术 -----CMatoperator(constCMatA,constCMatB){CMatC(A.rows,A.cols);for(size_t i0;iA.a.size();i)C.a[i]A.a[i]B.a[i];returnC;}CMatoperator-(constCMatA,constCMatB){CMatC(A.rows,A.cols);for(size_t i0;iA.a.size();i)C.a[i]A.a[i]-B.a[i];returnC;}CMatoperator*(constCMatA,constCMatB){if(A.cols!B.rows)throwstd::runtime_error(matmul: dim mismatch);CMatC(A.rows,B.cols);for(inti0;iA.rows;i)for(intk0;kA.cols;k){cx aikA(i,k);if(std::abs(aik)1e-300)continue;for(intj0;jB.cols;j)C(i,j)aik*B(k,j);}returnC;}CMatoperator*(cx s,constCMatA){CMatC(A.rows,A.cols);for(size_t i0;iA.a.size();i)C.a[i]s*A.a[i];returnC;}CMatoperator*(constCMatA,cx s){CMatC(A.rows,A.cols);for(size_t i0;iA.a.size();i)C.a[i]A.a[i]*s;returnC;}// Frobenius 范数doublefnorm(constCMatA){doubles0.0;for(constautoz:A.a)sstd::norm(z);returnstd::sqrt(s);}// // 高斯-约当求逆带部分选主元// CMatinverse(constCMatA){intnA.rows;if(n!A.cols)throwstd::runtime_error(inverse: not square);CMat MA;CMat ICMat::eye(n);for(intcol0;coln;col){// 选主元intpivcol;doublemxstd::abs(M(col,col));for(intrcol1;rn;r){doublevstd::abs(M(r,col));if(vmx){mxv;pivr;}}if(mx1e-14)throwstd::runtime_error(inverse: singular matrix);if(piv!col){for(intj0;jn;j){std::swap(M(col,j),M(piv,j));std::swap(I(col,j),I(piv,j));}}cx pM(col,col);for(intj0;jn;j){M(col,j)/p;I(col,j)/p;}for(intr0;rn;r){if(rcol)continue;cx fM(r,col);if(std::abs(f)1e-300)continue;for(intj0;jn;j){M(r,j)-f*M(col,j);I(r,j)-f*I(col,j);}}}returnI;}// // Denman-Beavers 迭代求主平方根// Y_{k1} 0.5 (Y_k Z_k^{-1})// Z_{k1} 0.5 (Z_k Y_k^{-1})// CMatmat_sqrt(constCMatA,intmax_it80,doubletol1e-15){intnA.rows;CMat YA;CMat ZCMat::eye(n);for(intk0;kmax_it;k){CMat Yiinverse(Y);CMat Ziinverse(Z);CMat Yn0.5*(YZi);CMat Zn0.5*(ZYi);doubleerrfnorm(Yn-Y);YYn;ZZn;if(errtol)break;}returnY;}// // 矩阵对数 log(A)A 的特征值不位于负实轴上// 方法: scaling-and-squaring Taylor 级数// log(A) 2^s * log(A^{1/2^s})// log(I N) N - N^2/2 N^3/3 - ...// CMatmat_log(constCMatA){intnA.rows;CMat ICMat::eye(n);CMat XA;ints0;// ---- 缩放: 反复开方直到接近单位阵 ----while(fnorm(X-I)0.5s30){Xmat_sqrt(X);s;}// ---- Taylor 级数 ----CMat NX-I;CMatR(n,n);CMat NkI;// N^0for(intk1;k100;k){NkNk*N;// N^kdoublecoef((k%2)1)?(1.0/k):(-1.0/k);RRcx(coef,0.0)*Nk;if(fnorm(Nk)/k1e-20)break;}// ---- 缩放回原尺度 ----Rstd::pow(2.0,s)*R;returnR;}// // 实矩阵接口// usingRMatstd::vectorstd::vectordouble;// d2c (ZOH 方法)// 输入: Phi (n×n), Gamma (n×m), Ts// 输出: Ac (n×n), Bc (n×m)voidd2c_zoh(constRMatPhi,constRMatGamma,doubleTs,RMatAc,RMatBc){intnstatic_castint(Phi.size());intmstatic_castint(Gamma[0].size());// ---- 构造增广矩阵 M [ Phi Gamma ; 0 I ] ----CMatM(nm,nm);for(inti0;in;i){for(intj0;jn;j)M(i,j)Phi[i][j];for(intj0;jm;j)M(i,nj)Gamma[i][j];}for(inti0;im;i)M(ni,ni)1.0;// ---- L log(M) / Ts ----CMat Lmat_log(M);L(1.0/Ts)*L;// ---- 提取 A、B取实部 ----Ac.assign(n,std::vectordouble(n));Bc.assign(n,std::vectordouble(m));for(inti0;in;i){for(intj0;jn;j)Ac[i][j]L(i,j).real();for(intj0;jm;j)Bc[i][j]L(i,nj).real();}}// ---- 打印辅助 ----voidprint_mat(conststd::stringname,constRMatA){std::coutname:\n;for(constautorow:A){for(doublev:row)std::coutstd::setw(12)v ;std::cout\n;}}// // 主程序: 演示// intmain(){std::coutstd::fixedstd::setprecision(6);// ---------- 测试 1: 二阶系统 ----------RMat Phi1{{0.9,0.1},{0.0,0.8}};RMat Gam1{{1.0},{0.5}};doubleTs0.1;std::cout 测试 1: 二阶系统 d2c (ZOH) \n;print_mat(离散 Phi,Phi1);print_mat(离散 Gamma,Gam1);std::coutTs Ts\n\n;RMat Ac1,Bc1;d2c_zoh(Phi1,Gam1,Ts,Ac1,Bc1);print_mat(连续 A,Ac1);print_mat(连续 B,Bc1);// ---------- 测试 2: Phi I 特殊情况 ----------RMat Phi2{{1.0}};RMat Gam2{{2.0}};std::cout\n 测试 2: Phi I 特殊情况 \n;RMat Ac2,Bc2;d2c_zoh(Phi2,Gam2,Ts,Ac2,Bc2);print_mat(连续 A (理论 0),Ac2);print_mat(连续 B (理论 Gamma/Ts 20),Bc2);// ---------- 测试 3: 标量系统 ----------RMat Phi3{{0.5}};RMat Gam3{{1.0}};std::cout\n 测试 3: 标量系统 \n;RMat Ac3,Bc3;d2c_zoh(Phi3,Gam3,Ts,Ac3,Bc3);print_mat(连续 A,Ac3);print_mat(连续 B,Bc3);std::cout理论 A log(0.5)/Ts std::log(0.5)/Ts\n;std::cout理论 B Gamma*A/(Phi-1) 1.0*(std::log(0.5)/Ts)/(0.5-1.0)\n;return0;}
企业数字化 ERP 产品动态
相关推荐
Atlas 300V部署YOLOv5全指南:从模型转换到性能调优 最近在做一个边缘AI推理项目,客户指定要在Atlas平台上跑YOLOv5目标检测,整个过程中从选型、部署到调优踩了不少坑。今天把整个项目完整拆一遍,从Atlas 300V 24G这块卡到底是不是运算加速卡开始,到最终YOLO模型成功上卡推理&#x… · 2026/9/26 11:08:04
风力叶片缺陷检测数据集解析:VOC标注转YOLO训练全流程 简介:风力叶片缺陷检测数据集专为风电运维与无人机巡检场景设计,面向计算机视觉算法工程师、科研人员及相关专业学生,可用于训练和评估目标检测模型,识别排水孔受损、雷击、污垢、漏油、PU胶带、表面裂纹及侵蚀等多类型缺陷。压缩… · 2026/9/26 11:08:04
飞书告警 AI 研判系统部署指南:TaoToken 统一 Key 接入与 systemd 守护配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:08:04
基于MediaPipe Holistic的八段锦动作识别:75个关键点与DTW匹配实战 简介:基于计算机视觉的八段锦智能辅助训练系统选用MediaPipe Holistic模型,可同时检测33个身体关键点和42个手部关键点,在自建测试集上对8个标准动作的识别准确率达92%。资源面向动作识别与姿态估计方向的开发者、科研人员,可落地… · 2026/9/26 11:37:15
基于STM32的智能鸽子驯养系统:从定时器到状态机的嵌入式实战解析 如果你的课题或者自己的小项目恰好是“基于STM32的智能鸽子驯养系统”,先别急着把它当成一个冷门的养殖设备。我做完这个项目最大的感受是:它本质上是一个把STM32核心外设几乎全用上的综合嵌入式练习。定时器、PWM、输入捕获、编码器模式、通信接口、电源… · 2026/9/26 11:37:08
dalle3 图像生成实战:用 TaoToken 统一 Key 打通 better captions 工作流 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:37:08
CUDA版PyTorch安装实战:驱动检查、版本选择与验证排坑全指南 很多人看到“CUDA版PyTorch”这串词,第一反应就是安装过程复杂、变量太多。我在Windows笔记本和Linux服务器上反复装过十几遍环境之后想告诉你,真正费时间的不是安装动作本身,而是几个特别容易让人卡住的概念——比如驱动和CUDA到底什么关系、… · 2026/9/26 11:37:08
PX4固件体系结构深度解析:从实时操作系统到uORB中间件 1. 先搞清楚PX4到底是个什么东西我最早接触PX4的时候,跟很多人一样,以为它就是一套飞控固件,烧进Pixhawk里就能飞。后来真正开始看源码、改代码、调参,才发现事情没那么简单——PX4不是一个“程序”,而是一整套软件体系… · 2026/9/26 11:37:02
kubectl资源管理命令实战:从排查故障到集群运维的完整指南 1. 为什么资源管理命令值得系统性掌握
1.1 从一次"排查半小时"的真实经历说起 大概两年前的一个工作日下午,集群告警突然嗡嗡响起来,某核心服务连续三次健康检查失败。我当时的反应和大多数刚上手 Kubernetes 的运维一样,先 kube… · 2026/9/26 11:36:56
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46