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

发布时间:2026/11/5 3:52:47

C++代码实现MATLAB中的partial_corr函数功能 #includeiostream#includevector#includecmath#includestdexcepttypedefstd::vectordoubleVec;typedefstd::vectorVecMat;// Mat[i][j] 第 i 行第 j 列// 1. 特殊函数lgamma / 不完全 Beta // ln GammaLanczos 近似Numerical Recipes 系数doublegammln(doublexx){staticconstdoublecof[6]{76.18009172947146,-86.50532032941677,24.01409824083091,-1.231739572450155,0.1208650973866179e-2,-0.5395239384953e-5};doublexxx,yxx;doubletmpx5.5;tmp-(x0.5)*std::log(tmp);doubleser1.000000000190015;for(intj0;j6;j){y1.0;sercof[j]/y;}return-tmpstd::log(2.5066282746310005*ser/x);}// 正则化不完全 Beta 的连分数部分doublebetacf(doublea,doubleb,doublex){constintMAXIT300;constdoubleEPS3e-15,FPMIN1e-300;doubleqabab,qapa1.0,qama-1.0;doublec1.0;doubled1.0-qab*x/qap;if(std::fabs(d)FPMIN)dFPMIN;d1.0/d;doublehd;for(intm1;mMAXIT;m){intm22*m;doubleaam*(b-m)*x/((qamm2)*(am2));d1.0aa*d;if(std::fabs(d)FPMIN)dFPMIN;c1.0aa/c;if(std::fabs(c)FPMIN)cFPMIN;d1.0/d;h*d*c;aa-(am)*(qabm)*x/((am2)*(qapm2));d1.0aa*d;if(std::fabs(d)FPMIN)dFPMIN;c1.0aa/c;if(std::fabs(c)FPMIN)cFPMIN;d1.0/d;doubledeld*c;h*del;if(std::fabs(del-1.0)EPS)break;}returnh;}// 正则化不完全 Beta 函数 I_x(a,b)doublebetai(doublea,doubleb,doublex){if(x0.0)return0.0;if(x1.0)return1.0;doublebtstd::exp(gammln(ab)-gammln(a)-gammln(b)a*std::log(x)b*std::log(1.0-x));if(x(a1.0)/(ab2.0))returnbt*betacf(a,b,x)/a;elsereturn1.0-bt*betacf(b,a,1.0-x)/b;}// 2. 最小二乘Householder QR // 解 A*beta ≈ bA 为 m×nm≥nVeclstsq(constMatA,constVecb){intm(int)A.size();if(m0)returnVec();intn(int)A[0].size();if(n0)returnVec();Mat RA;Vec yb;for(intk0;kn;k){doublenorm0.0;for(intik;im;i)normR[i][k]*R[i][k];normstd::sqrt(norm);if(norm1e-300)continue;doublealpha(R[k][k]0.0)?-norm:norm;Vecv(m-k);for(intik;im;i)v[i-k]R[i][k];v[0]-alpha;doublevnorm20.0;for(inti0;im-k;i)vnorm2v[i]*v[i];if(vnorm21e-300)continue;for(intjk;jn;j){doubledot0.0;for(intik;im;i)dotv[i-k]*R[i][j];doublef2.0*dot/vnorm2;for(intik;im;i)R[i][j]-f*v[i-k];}doubledot0.0;for(intik;im;i)dotv[i-k]*y[i];doublef2.0*dot/vnorm2;for(intik;im;i)y[i]-f*v[i-k];}Vecbeta(n,0.0);for(intin-1;i0;--i){doublesy[i];for(intji1;jn;j)s-R[i][j]*beta[j];beta[i](std::fabs(R[i][i])1e-300)?0.0:s/R[i][i];}returnbeta;}// 3. 统计核心 doublemean(constVecv){doubles0.0;for(size_t i0;iv.size();i)sv[i];returns/v.size();}doublepearson(constVeca,constVecb){doublemamean(a),mbmean(b);doublenum0.0,da0.0,db0.0;for(size_t i0;ia.size();i){doublexaa[i]-ma,xbb[i]-mb;numxa*xb;daxa*xa;dbxb*xb;}doubledenomstd::sqrt(da*db);if(denom1e-15)return0.0;returnnum/denom;}Vecresidualize(constVecv,constMatZ){intn(int)v.size();intk(Z.empty()||Z[0].empty())?0:(int)Z[0].size();// 增广常数列截距项与 MATLAB partialcorr 的回归口径一致// 残差 v - [1 Z] * beta而非过原点回归 v ~ ZMatZa(n,Vec(k1,0.0));for(inti0;in;i){Za[i][0]1.0;for(intj0;jk;j)Za[i][j1]Z[i][j];}Vec betalstsq(Za,v);Vecr(n);for(inti0;in;i){doublesbeta[0];for(intj0;jk;j)sZ[i][j]*beta[j1];r[i]v[i]-s;}returnr;}VecgetCol(constMatM,intj){Vecc(M.size());for(size_t i0;iM.size();i)c[i]M[i][j];returnc;}// 对应 MATLAB: partialcorr(X, Y, Z)Matpartialcorr(constMatX,constMatY,constMatZ){intn(int)X.size();if((int)Y.size()!n)throwstd::runtime_error(X,Y row mismatch);intpx(int)X[0].size(),py(int)Y[0].size();std::vectorVecrx(px),ry(py);for(intj0;jpx;j)rx[j]residualize(getCol(X,j),Z);for(intj0;jpy;j)ry[j]residualize(getCol(Y,j),Z);Matrho(px,Vec(py));for(inti0;ipx;i)for(intj0;jpy;j)rho[i][j]pearson(rx[i],ry[j]);returnrho;}// t 分布双侧 p 值p I_{df/(dft²)}(df/2, 1/2)doublet_pval(doubler,intdf){if(std::fabs(r)1.0)return0.0;doublet2r*r*df/(1.0-r*r);doublexdf/(dft2);returnbetai(df/2.0,0.5,x);}Matpartialcorr_pval(constMatrho,intn,intk){intpx(int)rho.size(),py(int)rho[0].size();intdfn-k-2;if(df0)throwstd::runtime_error(Not enough degrees of freedom);Matpv(px,Vec(py));for(inti0;ipx;i)for(intj0;jpy;j)pv[i][j]t_pval(rho[i][j],df);returnpv;}// 4. 输出 voidprintMat(constMatM){for(size_t i0;iM.size();i){for(size_t j0;jM[i].size();j){if(j)std::cout ;std::coutM[i][j];}std::cout\n;}}intmain(){// n 6 的确定性数据便于复现Mat Z{{1},{2},{3},{4},{5},{6}};Mat X{{2},{4},{5},{4},{5},{7}};Mat Y{{2},{5},{6},{7},{8},{11}};Mat rhopartialcorr(X,Y,Z);Mat pvalpartialcorr_pval(rho,(int)X.size(),(int)Z[0].size());std::coutpartial correlation:\n;printMat(rho);std::cout\np-value:\n;printMat(pval);return0;}
延伸阅读

更多相关文章

2026/11/5 3:47:47

Win7下成功安装深度学习库的完整教程

这两天我忙着安装那个深度学习库。我是真的尝试了好多遍。CMake、MinGW、BLAS这些东西, 我全部都装了。然后自己试着去编译, 在网上也搜索了一大堆教程。但是不管怎么弄, 就是都没有成功。一直到昨晚的晚上, 我回家把电脑清理干净了。接着我又小心翼翼地重装了一遍。这一次是成…

2026/11/5 5:07:55

未来展望:Horizon路线图与即将推出的重磅功能预览

未来展望:Horizon路线图与即将推出的重磅功能预览 【免费下载链接】Horizon 📡 Your own AI-powered news radar. Generates daily briefings in English & Chinese. | 用 AI 构建你专属的新闻雷达 项目地址: https://gitcode.com/GitHub_Trending…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑