尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C++代码实现MATLAB中的normalize函数功能
#includeiostream#includevector#includecmath#includenumeric#includealgorithm#includestdexcept#includestring#includecassert// // 辅助函数// // 计算算术平均值doublecomputeMean(conststd::vectordoublev){if(v.empty())return0.0;doublesumstd::accumulate(v.begin(),v.end(),0.0);returnsum/static_castdouble(v.size());}// 计算样本标准差除以 N-1与 MATLAB normalize 默认行为一致doublecomputeStd(conststd::vectordoublev,doublemean){if(v.size()2)return0.0;doublesqSum0.0;for(doublex:v){doublediffx-mean;sqSumdiff*diff;}returnstd::sqrt(sqSum/static_castdouble(v.size()-1));}// 计算中位数doublecomputeMedian(std::vectordoublev){if(v.empty())return0.0;std::sort(v.begin(),v.end());size_t nv.size();if(n%20){return(v[n/2-1]v[n/2])/2.0;}else{returnv[n/2];}}// 计算 MAD中位数绝对偏差doublecomputeMAD(conststd::vectordoublev,doublemedian){if(v.empty())return0.0;std::vectordoubleabsDev;absDev.reserve(v.size());for(doublex:v){absDev.push_back(std::abs(x-median));}returncomputeMedian(absDev);}// 计算 L2 范数欧几里得范数doublecomputeNormL2(conststd::vectordoublev){doublesqSum0.0;for(doublex:v){sqSumx*x;}returnstd::sqrt(sqSum);}// 计算 IQR四分位距doublecomputeIQR(std::vectordoublev){if(v.size()2)return0.0;std::sort(v.begin(),v.end());size_t nv.size();autopercentile[](doublep)-double{doubleidxp*(static_castdouble(n)-1.0);size_t lostatic_castsize_t(std::floor(idx));size_t histatic_castsize_t(std::ceil(idx));if(lohi)returnv[lo];doublefracidx-static_castdouble(lo);returnv[lo]*(1.0-frac)v[hi]*frac;};returnpercentile(0.75)-percentile(0.25);}// // 核心归一化函数对一维向量// // zscore中心化为均值 0缩放为标准差 1std::vectordoublenormalizeZscore(conststd::vectordoublev){doublemeancomputeMean(v);doublesdcomputeStd(v,mean);std::vectordoubleresult(v.size());for(size_t i0;iv.size();i){result[i](sd!0.0)?(v[i]-mean)/sd:0.0;}returnresult;}// norm按 L2 范数归一化std::vectordoublenormalizeNorm(conststd::vectordoublev){doublenormValcomputeNormL2(v);std::vectordoubleresult(v.size());for(size_t i0;iv.size();i){result[i](normVal!0.0)?v[i]/normVal:0.0;}returnresult;}// range重缩放到 [0, 1]std::vectordoublenormalizeRange(conststd::vectordoublev){if(v.empty())return{};auto[minIt,maxIt]std::minmax_element(v.begin(),v.end());doubleminVal*minIt,maxVal*maxIt;doublerangemaxVal-minVal;std::vectordoubleresult(v.size());for(size_t i0;iv.size();i){result[i](range!0.0)?(v[i]-minVal)/range:0.0;}returnresult;}// medianiqr中心化为中位数缩放为 IQRstd::vectordoublenormalizeMedianIQR(conststd::vectordoublev){doublemedcomputeMedian(v);doubleiqrcomputeIQR(v);std::vectordoubleresult(v.size());for(size_t i0;iv.size();i){result[i](iqr!0.0)?(v[i]-med)/iqr:0.0;}returnresult;}// centerscale 通用形式可自定义中心化值和缩放值std::vectordoublenormalizeCenterScale(conststd::vectordoublev,doublecenter,doublescale){std::vectordoubleresult(v.size());for(size_t i0;iv.size();i){result[i](scale!0.0)?(v[i]-center)/scale:0.0;}returnresult;}// // 矩阵归一化按列处理与 MATLAB normalize(A) 默认行为一致// classMatrix{public:size_t rows,cols;std::vectordoubledata;// 列优先存储Matrix(size_t r,size_t c):rows(r),cols(c),data(r*c,0.0){}doubleoperator()(size_t i,size_t j){returndata[ij*rows];}doubleoperator()(size_t i,size_t j)const{returndata[ij*rows];}// 提取第 j 列std::vectordoublegetColumn(size_t j)const{std::vectordoublecol(rows);for(size_t i0;irows;i){col[i](*this)(i,j);}returncol;}// 设置第 j 列voidsetColumn(size_t j,conststd::vectordoublecol){for(size_t i0;irows;i){(*this)(i,j)col[i];}}// 提取第 i 行std::vectordoublegetRow(size_t i)const{std::vectordoublerow(cols);for(size_t j0;jcols;j){row[j](*this)(i,j);}returnrow;}// 设置第 i 行voidsetRow(size_t i,conststd::vectordoublerow){for(size_t j0;jcols;j){(*this)(i,j)row[j];}}};// 按指定维度归一化矩阵// dim1: 按列归一化默认dim2: 按行归一化MatrixnormalizeMatrix(constMatrixA,intdim1,conststd::stringmethodzscore){Matrixresult(A.rows,A.cols);if(dim1){// 按列处理for(size_t j0;jA.cols;j){std::vectordoublecolA.getColumn(j);std::vectordoublenormCol;if(methodzscore){normColnormalizeZscore(col);}elseif(methodnorm){normColnormalizeNorm(col);}elseif(methodrange){normColnormalizeRange(col);}elseif(methodmedianiqr){normColnormalizeMedianIQR(col);}else{throwstd::invalid_argument(Unknown method: method);}result.setColumn(j,normCol);}}elseif(dim2){// 按行处理for(size_t i0;iA.rows;i){std::vectordoublerowA.getRow(i);std::vectordoublenormRow;if(methodzscore){normRownormalizeZscore(row);}elseif(methodnorm){normRownormalizeNorm(row);}elseif(methodrange){normRownormalizeRange(row);}elseif(methodmedianiqr){normRownormalizeMedianIQR(row);}else{throwstd::invalid_argument(Unknown method: method);}result.setRow(i,normRow);}}else{throwstd::invalid_argument(dim must be 1 or 2);}returnresult;}// // 使用示例// intmain(){// 示例 1向量 zscore 归一化对应 MATLAB: normalize(1:5)std::vectordoublev{1,2,3,4,5};auton1normalizeZscore(v);std::coutzscore: ;for(doublex:n1)std::coutx ;std::cout\n;// 示例 2向量 L2 范数归一化auton2normalizeNorm(v);std::coutnorm: ;for(doublex:n2)std::coutx ;std::cout\n;// 示例 3range 归一化到 [0,1]auton3normalizeRange(v);std::coutrange: ;for(doublex:n3)std::coutx ;std::cout\n;// 示例 4矩阵按列 zscore 归一化MatrixA(3,3);// [8 1 6]// [3 5 7]// [4 9 2]A(0,0)8;A(0,1)1;A(0,2)6;A(1,0)3;A(1,1)5;A(1,2)7;A(2,0)4;A(2,1)9;A(2,2)2;Matrix NnormalizeMatrix(A,1,zscore);std::cout\nMatrix zscore (by column):\n;for(size_t i0;iN.rows;i){for(size_t j0;jN.cols;j){std::coutN(i,j)\t;}std::cout\n;}// 示例 5矩阵按行 zscore 归一化Matrix N2normalizeMatrix(A,2,zscore);std::cout\nMatrix zscore (by row):\n;for(size_t i0;iN2.rows;i){for(size_t j0;jN2.cols;j){std::coutN2(i,j)\t;}std::cout\n;}return0;}
RELATED

相关推荐

微客AI助手踩坑实录:企业微信客服扫码接入一直报错——两种 ID 长一个样却用混了

微客AI助手踩坑实录:企业微信客服扫码接入一直报错——两种 ID 长一个样却用混了

企业微信客服这条接入链路,我们从零跑通花了整整一个下午,其中两个小时的排查完全是被一个"看起来没问题"的链接浪费掉的。这篇把根因和修法复盘清楚,给同样要走这条路的同行省时间。## 事故现场:客户扫码后页面提示无法…

📅 2026/10/8 2:09:13
MPC-HC 媒体播放器配置指南:硬件解码加速与字幕加载的正确姿势

MPC-HC 媒体播放器配置指南:硬件解码加速与字幕加载的正确姿势

MPC-HC 媒体播放器配置指南:硬件解码加速与字幕加载的正确姿势 老旧电脑播 4K 卡成幻灯片?MPC-HC(GPL-3.0 开源,clsid2 维护分支)是轻量播放器里的常青树:资源占用极低、几乎全格式内置解码、开启硬件加速…

📅 2026/10/8 2:04:12
VSCodium 使用入门:VS Code 开源无遥测构建的安装配置与插件商店方案

VSCodium 使用入门:VS Code 开源无遥测构建的安装配置与插件商店方案

VSCodium 使用入门:VS Code 开源无遥测构建的安装配置与插件商店 VS Code 好用,但默认开启的遥测与产品许可额外条款让不少人介意。VSCodium 是社区用 VS Code 同一份开源内核构建出的纯开源发行版(MIT):界面、快捷键…

📅 2026/10/8 2:04:12
MORE NEWS

更多资讯

📰

S/4HANA SD信贷管理实战:检查规则配置与订单冻结排查之路

做SAP SD这行的,最怕哪个环节出岔子?在我看来,信贷冻结要是炸了,销售找你、财务找你、老板也找你,订单卡在VKM2里出不去,月底对账还得陪着SAP一起熬。今天这篇继续聊S/4HANA SD里的信贷管理,这是…

📰

VMware创建虚拟机安装RHEL9并配置SSH远程连接的完整实战指南

想在公司电脑上折腾 Linux 服务器,又不敢碰真实硬件,最靠谱的方案就是开个虚拟机练手。我最近正好从零走了一遍“VMware 创建虚拟机 → 安装 RHEL9 → 宿主机用 SSH 连进去”的完整流程,整个过程不算复杂,但有几个坑确实容易让新手…

📰

React Native开发OpenHarmony应用实战:从环境搭建到性能优化

1. 项目概述与技术选型:AnimeHub为什么选择RN开发OpenHarmony应用先交代一下项目背景。AnimeHub是一个面向动漫爱好者的内容聚合应用,主打追番、热播推荐、分类浏览等功能。这个项目从一开始就定了一个目标:不仅要跑在Android和iOS上&#xf…

📰

m3u8转MP4全攻略:从HLS原理到在线工具与ffmpeg实战

最近总有朋友拿着一张m3u8链接跑来问我:这东西到底怎么下载?浏览器打开要么乱码,要么明明能播却找不到下载按钮。每次我都要从m3u8是什么讲起,讲完对方还是似懂非懂。后来我发现,与其劝人折腾ffmpeg命令、装一堆软件&a…

📰

开源视频流服务器选型与部署实战:四大主流方案对比与延迟优化

做直播、做监控、做视频点播,说到底绕不开“视频流服务器”这个中间层。我这些年帮团队和客户搭过不少流媒体环境,结论很直接:商业产品能干的活儿,目前主流、免费且开源的视频流服务器几乎都能干,定制空间反而更大&…

📰

Whisper vs Vosk:Python离线语音识别方案与工程实践

最近圈里总有朋友问我同一个问题:Python做语音识别到底该上哪个库?网上搜来搜去,翻来覆去就是whisper和vosk这两个名字,可真到动手的时候,很多人连环境都搭不起来,更别说搞清楚两个框架到底怎么分工了。我这…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬