<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>椭圆规/tuoyuangui</title><description>Blog of tuoyuangui</description><link>https://tuoyuangui.github.io/</link><language>zh_CN</language><item><title>AI每周总结-地球物理（2026-W41）</title><link>https://tuoyuangui.github.io/website/posts/typora/ai%E6%AF%8F%E6%97%A5%E6%80%BB%E7%BB%93/ai%E6%AF%8F%E5%91%A8%E6%80%BB%E7%BB%93_2026-w41/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/ai%E6%AF%8F%E6%97%A5%E6%80%BB%E7%BB%93/ai%E6%AF%8F%E5%91%A8%E6%80%BB%E7%BB%93_2026-w41/</guid><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AI每周总结 · 地球物理（2026-W41：2026-10-05 ~ 2026-10-11）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;项目对象 &lt;code&gt;project&lt;/code&gt;&lt;/strong&gt;：调度器仍未注入 &lt;code&gt;{{project}}&lt;/code&gt;，沿用默认口径 &lt;strong&gt;AI + 深度学习 + HPC + 地震数据处理 + 全波形反演（FWI）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;📌 分类口径（本期起生效）&lt;/strong&gt;：&lt;strong&gt;AI/地球物理&lt;/strong&gt; = 以深度学习/机器学习/神经网络/生成模型等为核心创新；&lt;strong&gt;传统方法&lt;/strong&gt; = 以物理/数学/数值/信号处理/反演/成像/层析等为核心，不以 DL/ML 为主要创新。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本周期两类条数分布&lt;/strong&gt;：28 条位（主榜 10 + 补遗 6 + 延伸观察 12）中 &lt;strong&gt;AI/地球物理 19 条、传统方法 9 条&lt;/strong&gt;。主窗口主榜原 10 条中传统方法仅 1 条（Q-FWI），为满足&quot;传统约 4 条&quot;配比，&lt;strong&gt;从延伸观察升入 3 条可验证的传统方法条目&lt;/strong&gt;（TREMOR、SPECFEM3D 转动分量扩展、5D Radon 内存高效插值），另将断档补遗中的 B5（BFBM3D）在索引中标注为传统方法候选——&lt;strong&gt;升入原因与可信度逐条注明，未凑数&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;一、本周概览&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;覆盖区间（ISO）&lt;/td&gt;
&lt;td&gt;2026-10-05 ~ 2026-10-11（2026-W41）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实际采集日&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 天&lt;/strong&gt;（10-08）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日报实际检索窗口&lt;/td&gt;
&lt;td&gt;2026-10-01 ~ 2026-10-08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;条目位&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;28 条&lt;/strong&gt;（主榜 10 + 断档补遗 6 + 延伸观察 12）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;两类分布（条位）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AI/地球物理 19 / 传统方法 9&lt;/strong&gt;（主榜 9:1；补遗 4:2；延伸观察 6:6——延伸观察是传统方法的富集区，与 W39 结论&quot;期刊侧是传统方法富矿&quot;同源）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⚠️ 采集缺口&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;W40（09-28 ~ 10-04）无日报&lt;/strong&gt;；10-09 ~ 10-11 无采集；上期日报为 09-25，&lt;strong&gt;间隔 13 天&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;去重情况&lt;/td&gt;
&lt;td&gt;主榜 10 条中有 2 条为跨期重复/同方向（SDI 范式再表述、SeisDiff-FNO 方向重复）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可复现资产&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GeoFWI3D 数据 DOI &lt;code&gt;10.5281/zenodo.20148778&lt;/code&gt;（CC BY 4.0，已实测可解析）&lt;/strong&gt;；⚠️ &lt;strong&gt;配套代码地址未获取&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开源地震栈&lt;/td&gt;
&lt;td&gt;Devito v4.8.23 / 2026-08-07、ObsPy 1.5.1 / 2026-08-28、SeisBench v0.12.0 / 2026-06-24——&lt;strong&gt;连续四期无新版本&lt;/strong&gt;（本次为双周复查日，实测确认）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;来源结构&lt;/td&gt;
&lt;td&gt;主榜 &lt;strong&gt;6/10 来自正式期刊&lt;/strong&gt;；补遗 &lt;strong&gt;6/6 全部来自期刊&lt;/strong&gt;——延续 W39 的&quot;期刊侧主导&quot;结论&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;二、本周主线（5 条；每条标注所涉类别）&lt;/h2&gt;
&lt;h3&gt;主线 1 ·【AI/地球物理】隐式/生成式 FWI 从&quot;提出方法&quot;转向&quot;工程化改良&quot;，共同特征是&quot;低/零额外成本&quot;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;主榜 10 条里有 6 条落在这一带&lt;/strong&gt;（全部为 AI 线）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;改良点&lt;/th&gt;
&lt;th&gt;额外成本&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C2F-IFWI&lt;/strong&gt;（主榜 #3，arXiv 2610.01081）&lt;/td&gt;
&lt;td&gt;多分辨率哈希由粗到精激活&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;零额外参数&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;摄动式 IFWI&lt;/strong&gt;（补遗 B1，10.1093/gji/ggag403）&lt;/td&gt;
&lt;td&gt;参数分解 + 坐标归一化&lt;/td&gt;
&lt;td&gt;不改结构&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;谱归一化替代 WGAN-GP 梯度惩罚&lt;/strong&gt;（主榜 #6，10.1093/gji/ggag418）&lt;/td&gt;
&lt;td&gt;省掉插值采样&lt;/td&gt;
&lt;td&gt;更省&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;REG&lt;/strong&gt;（主榜 #5，arXiv 2610.05371）&lt;/td&gt;
&lt;td&gt;稳健集成引导：weighting + clipping&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;零额外 denoiser / forward 评估&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;扩散先验做正则&lt;/strong&gt;（主榜 #2，10.1029/2025jh001223）&lt;/td&gt;
&lt;td&gt;替换正则项&lt;/td&gt;
&lt;td&gt;不改主干&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prior-free ISI&lt;/strong&gt;（主榜 #7，10.1093/gji/ggag406）&lt;/td&gt;
&lt;td&gt;连续表示降计算负担&lt;/td&gt;
&lt;td&gt;去掉先验依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;判断&lt;/strong&gt;：这个领域已经过了&quot;堆大模型&quot;的阶段，正在进入**&quot;如何把已有的生成式/隐式表示接进物理流程而不炸&quot;**的阶段。这恰好是与工程条件最匹配的一段。&lt;/p&gt;
&lt;h3&gt;主线 2 ·【AI/地球物理·基础设施】基础设施终于出现：GeoFWI3D 大规模 3D 基准数据集&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;主榜 #1 GeoFWI3D&lt;/strong&gt;（arXiv 2610.01033，2026-10-01，&lt;strong&gt;License CC BY 4.0&lt;/strong&gt;）是本期、也是&lt;strong&gt;近 6 期以来第一个真正的大规模 3D 基准数据集&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;团队&lt;/strong&gt;：UT Austin + LANL + Uppsala + KFUPM（⚠️ 详见第八节）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：DOI &lt;strong&gt;&lt;code&gt;10.5281/zenodo.20148778&lt;/code&gt;&lt;/strong&gt;（✅ 已实测可解析）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technical Validation 章节把 &lt;em&gt;4.5 Data-Driven Surrogate for Traveltime and Wavefield Prediction&lt;/em&gt; 与 &lt;em&gt;4.6 Training 3D Diffusion Models&lt;/em&gt; 列为正式技术验证任务&lt;/strong&gt;——说明&quot;神经算子做正演代理 + 扩散模型做速度建模&quot;已从单点方法变成&lt;strong&gt;基准数据集要评测的能力项&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;论文第 6 节 &quot;Code availability&quot; 在 arXiv HTML 中为空，未解析出代码 URL&lt;/strong&gt;；数据集体量/格式未验证。&lt;strong&gt;这是本期的最高优先级挂账项。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;与 W39 的 SPBench 互补&lt;/strong&gt;：&lt;strong&gt;SPBench 说的是&quot;评测不规范&quot;，GeoFWI3D 提供的是&quot;可以用来规范评测的东西&quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;主线 3 ·【AI/地球物理】扩散模型在地球物理里的角色已分化成三种&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;角色&lt;/th&gt;
&lt;th&gt;代表条目&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;① 生成器 / 先验&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;主榜 #2（10.1029/2025jh001223，KAUST）、#5（REG）&lt;/td&gt;
&lt;td&gt;沿既有路线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;② 正则化器&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;主榜 #2（替换正则项）&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;③ 多尺度特征提取器&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;补遗 B4 DiffClassNet&lt;/strong&gt;（10.1093/gji/ggag383）&lt;/td&gt;
&lt;td&gt;拿中间噪声水平的特征做分类&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;判断&lt;/strong&gt;：只把扩散模型当&quot;又一个生成式反演器&quot;会低估它。&lt;strong&gt;第三种用法（用扩散中间层的噪声水平特征做分类）在监督信号稀缺时尤其有用。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;主线 4 ·【传统方法·HPC】HPC 侧继续薄弱，但本期&quot;最接近真 HPC&quot;的三条全部是传统方法线&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本窗口内没有一条以&quot;大规模并行 / GPU 内核 / 显存优化&quot;为主贡献的地震条目&lt;/strong&gt;——但最接近的三条&lt;strong&gt;全部为传统方法&lt;/strong&gt;，且都在&lt;strong&gt;延伸观察&lt;/strong&gt;里：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TREMOR&lt;/strong&gt;（分布式模板匹配，&lt;strong&gt;12× 加速且保证结果等价&lt;/strong&gt;，传统·HPC 系统）——&lt;strong&gt;本期已升入精选榜（见第三节）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5D Radon 内存高效群稀疏插值&lt;/strong&gt;（&lt;strong&gt;避免物化完整 5D 数组&lt;/strong&gt;——与 W39 的&quot;内存而非 FLOPs&quot;判据同源，传统·信号处理/HPC）——&lt;strong&gt;本期已升入精选榜&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SPECFEM3D 转动分量扩展&lt;/strong&gt;（谱元法数值方法，传统·数值）——&lt;strong&gt;本期已升入精选榜&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;叠加&lt;strong&gt;开源栈连续四期零 release&lt;/strong&gt;（Devito / ObsPy / SeisBench，本次双周复查日实测确认）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结论仍然是：HPC 能力需要自建，不能等上游。&lt;/strong&gt; 且与 W39 一致——&lt;strong&gt;HPC 增量主要出现在传统方法线&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这解释了为什么本期主榜里&quot;零额外算力开销&quot;的方法改良特别密集——整个领域都在算力受限下找便宜的涨点方式。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;主线 5 ·【两类通用】来源结构与诚实性问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;期刊侧主导（延续 W39 的判断）&lt;/strong&gt;：主榜 10 条中 &lt;strong&gt;6 条来自正式期刊&lt;/strong&gt;（JGR ML&amp;amp;C ×2、GJI ×2、Interpretation ×1、&lt;em&gt;Geophysics&lt;/em&gt; ×1 计在补遗），&lt;strong&gt;4 条来自 arXiv&lt;/strong&gt;；&lt;strong&gt;补遗 6 条全部来自期刊&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 一个必须提醒自己的诚实性问题&lt;/strong&gt;：本期主榜 10 条中，&lt;strong&gt;只有 1 条（REG）给出了可直接引用的量化数字&lt;/strong&gt;（PSNR +6.2–8.2 dB、NS 误差 −26.4%）；其余各条的收益表述&lt;strong&gt;几乎全是定性的&lt;/strong&gt;（&quot;faster&quot;&quot;more accurate&quot;&quot;more robust&quot;&quot;promising&quot;）。
&lt;strong&gt;这意味着本期的&quot;进展&quot;更像方向确认而非性能突破&lt;/strong&gt;，任何基于这些条目做的选型决策都应该以自复现为准，&lt;strong&gt;不要直接引用摘要里的形容词&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传统方法条目在延伸观察中富集&lt;/strong&gt;（6/12），与其进主榜与否无关地持续产出——&lt;strong&gt;说明&quot;传统方法没死&quot;，只是在本窗口的 AI 检索口径下被挤到观察区&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;三、本周精选 Top 10（AI/地球物理 6 条 + 传统方法 4 条，整体按相关性排序）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;配比说明&lt;/strong&gt;：主窗口主榜原 10 条经归类后为 &lt;strong&gt;AI 9 条 + 传统 1 条&lt;/strong&gt;（Q-FWI）。传统方法可验证条目不足 4 条的原因：① 本周仅一个采集点、检索窗口仅 8 天；② 检索口径以&quot;AI + 地球物理&quot;为主，传统方法条目自然富集在延伸观察区。&lt;strong&gt;处理方式：从延伸观察升入 3 条可验证性较高的传统方法条目（TREMOR、SPECFEM3D 转动分量、5D Radon）补足 4 条配比&lt;/strong&gt;，升入条目的完整字段转述自日报延伸观察节、&lt;strong&gt;未做新推断&lt;/strong&gt;；被顶出的 3 条 AI 条目（Camie 油田、CRG 去混叠、谱归一化 GAN）移入提名区，&lt;strong&gt;信息无损失&lt;/strong&gt;。断档补遗中的 B5（BFBM3D）同为传统方法，因窗口归属问题保留在补遗节并标注类别。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1. ⭐ GeoFWI3D：面向深度学习辅助地震成像的大规模三维速度模型数据集&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（基准数据集，服务于 DL 地震成像）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：UT Austin + LANL + Uppsala + KFUPM（⚠️ 见第八节）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2610.01033（v1，2026-10-01，physics.geo-ph，&lt;strong&gt;CC BY 4.0&lt;/strong&gt;）· https://arxiv.org/abs/2610.01033&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法/内容&lt;/strong&gt;：大规模 3D 速度模型数据集；Technical Validation 章节将&quot;数据驱动代理做走时/波场预测&quot;与&quot;训练 3D 扩散模型&quot;列为正式验证任务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：Zenodo &lt;strong&gt;DOI 10.5281/zenodo.20148778&lt;/strong&gt;（✅ 已实测可解析；⚠️ 体量/格式未验证）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：⚠️ &lt;strong&gt;论文第 6 节 &quot;Code availability&quot; 在 arXiv HTML 中为空&lt;/strong&gt; → 未获取&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;最高价值的一条。&lt;/strong&gt; 它把&quot;神经算子做正演代理 + 扩散做速度建模&quot;从单点方法&lt;strong&gt;抬升为基准要评测的能力项&lt;/strong&gt;；与 SPBench 构成&quot;评测规范 / 可评测对象&quot;的互补组合。建议作为&lt;strong&gt;3D 代理模型与扩散 VMB 的统一评测底座&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ arXiv 元数据 + 数据 DOI 可解析性实测；⚠️ &lt;strong&gt;代码地址未获取（最高优先级挂账）&lt;/strong&gt;、数据集体量与格式未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 扩散先验 + 神经算子的 time-lag 图像速度建模&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（扩散先验 + 神经算子）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：KAUST（Ma / Taufik / Alkhalifah）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;JGR: Machine Learning and Computation&lt;/em&gt; · https://doi.org/10.1029/2025jh001223（published [2026,10]，&lt;strong&gt;published-online 2026-10-03&lt;/strong&gt;，Crossref created 2026-10-03）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：以 &lt;strong&gt;time-lag 图像&lt;/strong&gt;为条件，用&lt;strong&gt;神经算子&lt;/strong&gt;增强的扩散先验做速度模型建立；明确做了 synthetic 与 field data 两个层面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：合成 + 实测（详见全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;是 W39 期 09-23 #1（扩散式由浅到深 VMB）的&quot;可核验落地版本&quot;&lt;/strong&gt;——给出完整摘要 + 完整机构 + 上线日期，比 09-23 那条更可核验。建议作为&lt;strong&gt;扩散 VMB 的对照基线与复现目标&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 期刊/DOI/机构/上线日期经 Crossref 核验；⚠️ 量化数值需读全文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. ⭐ REG：面向科学反问题的稳健集成引导&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（生成式反演器的后处理层）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ &lt;strong&gt;机构未验证&lt;/strong&gt;（HTML 404，API 无 affiliation）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2610.05371（v1，2026-10-04，cs.LG）· https://arxiv.org/abs/2610.05371&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：&lt;strong&gt;面向&quot;已训练好的生成式反演器&quot;的零成本后处理层&lt;/strong&gt;——通过 &lt;strong&gt;weighting + clipping&lt;/strong&gt; 稳健化集成引导。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：科学反问题基准（黑洞成像场景；详见全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化（本期唯一一条给出可引用数字的条目）&lt;/strong&gt;：黑洞场景 &lt;strong&gt;PSNR +6.2–8.2 dB&lt;/strong&gt;，&lt;strong&gt;NS 误差 −26.4%&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未验证（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;核心卖点是不额外调用 denoiser / forward model&lt;/strong&gt;——属于&quot;采样器外科手术&quot;式工作（前 5 期未见此类）。&lt;strong&gt;若已有训练好的扩散反演器，这是一层几乎零成本可直接加的后处理。&lt;/strong&gt; 建议先在小规模 FWI 扩散先验上做可行性验证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ 机构未验证、代码未验证；数字为作者自述。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. TREMOR：面向大规模地震数据集合的分布式模板匹配&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（分布式系统 / 数据序列处理；无学习组件）&lt;strong&gt;【自延伸观察升入，升入原因见配比说明】&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：Manos Chatzakis、Rodrigo Flores-Allende、Mikael Freire、Yoann Cano、Léonard Seydoux、Themis Palpanas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2610.02534（2026-10-01，cs.DB）· https://arxiv.org/abs/2610.02534&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：分布式数据序列处理框架，处理超出单机内存的波形集合，用于大规模模板匹配。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据/量化&lt;/strong&gt;：&lt;strong&gt;比最佳竞速方法快达 12×，且返回完全相同（exact）的结果&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未验证（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;本期 HPC 侧最有价值的一条。&lt;/strong&gt; &quot;exact same results + 12×&quot; 这类&lt;strong&gt;保证等价的加速&lt;/strong&gt;，在大规模模板匹配上是硬需求；其分布式序列处理架构对&quot;超出单机内存的地震数据集合&quot;场景有直接参考价值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ arXiv 元数据与作者列表核验（转述自日报延伸观察节）；⚠️ 12× 为作者自述，代码未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. C2F-IFWI：隐式全波形反演的多分辨率哈希由粗到精编码&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（隐式神经表示 INR）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：Linrong Wang / Shaowen Wang / Fan Min / Alkhalifah（⚠️ KAUST 由同组已出版论文反推确证，见第八节）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2610.01081（v1，2026-10-01，physics.geo-ph）· https://arxiv.org/abs/2610.01081&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：对隐式神经表示（INR）采用&lt;strong&gt;由粗到精的多分辨率哈希激活调度&lt;/strong&gt;，&lt;strong&gt;不增加任何可训练参数&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：FWI 基准（详见全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本期&quot;IFWI 工程化改良&quot;三条正交路线之一，&lt;strong&gt;卖点是零额外参数&lt;/strong&gt;——在算力受限场景下这是最友好的一类涨点方式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ &lt;strong&gt;脚注 1（Linrong Wang、Fan Min）机构未解析&lt;/strong&gt;；代码未声明；量化收益未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. Robust 5D 地震数据插值：内存高效群稀疏 Radon 变换&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（信号处理 / 反演；ℓ1-ℓ1 群稀疏优化，无 DL）&lt;strong&gt;【自延伸观察升入，升入原因见配比说明】&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：Ji Li（University of Calgary）、Dawei Liu（Xi&apos;an Jiaotong University）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;Geophysics&lt;/em&gt; · https://doi.org/10.1190/geo-2025-0371（created 2026-10-07）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：ℓ1-ℓ1 最小化 + &lt;strong&gt;强群稀疏&lt;/strong&gt;（沿慢度轴把 Radon 系数分入不重叠组 + 基于能量的贪婪选组）；关键工程贡献是&lt;strong&gt;内存高效实现&lt;/strong&gt;：不构造完整 5D Radon 立方体，而是跨频率片&lt;strong&gt;顺序累加群能量&lt;/strong&gt;，只对被选中的组更新系数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据/量化&lt;/strong&gt;：合成数据上优于 POCS 与阻尼秩缩减（DRR）（⚠️ 具体指标需读全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;&quot;避免物化完整 5D 数组&quot;是典型的 HPC 内存优化模式&lt;/strong&gt;，与我们在大规模 FWI 上的显存/内存压力同源，与 W39 的&quot;内存而非 FLOPs&quot;判据同源——&lt;strong&gt;方法论可直接迁移&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 期刊/DOI/作者机构核验（转述自日报延伸观察节）；⚠️ 量化对比数字需读全文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7. 共成像点道集（CIG）的自注意力 summary network 做速度建模&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（自注意力 + conditional flow matching）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：Georgia Tech（Herrmann 组）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2610.09282（v1，2026-10-07，cs.LG / physics.geo-ph，&lt;strong&gt;CC BY 4.0&lt;/strong&gt;）· https://arxiv.org/abs/2610.09282&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：用&lt;strong&gt;自注意力 summary network&lt;/strong&gt; 从 CIG 提取摘要统计量，配合 &lt;strong&gt;conditional flow matching&lt;/strong&gt; 做速度建模。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：速度建模基准（详见全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：把 &lt;strong&gt;CIG 从&quot;诊断量&quot;升格为&quot;条件变量&quot;&lt;/strong&gt;——这是本期新增方向之一，且与 W38 的 09-15 #2（CIG 条件化扩散联合反演）形成同一条线的延续。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ arXiv 元数据与许可核验；⚠️ 量化结果需读全文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8. 谱元法扩展：转动地震动的直接模拟（SPECFEM3D 扩展）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（谱元法数值模拟；无 DL）&lt;strong&gt;【自延伸观察升入，升入原因见配比说明】&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：Anjali C. Dhabu、Aida Hejazi Nooghabi、Céline Hadziioannou&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2610.09568（2026-10-07）· https://arxiv.org/abs/2610.09568&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：扩展 &lt;strong&gt;SPECFEM3D&lt;/strong&gt;，在 Gauss-Lobatto-Legendre 积分点上由位移空间梯度直接计算转动地震动；提出 &lt;strong&gt;PGRR 图&lt;/strong&gt;（类比 PGV 图）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：印度河-恒河盆地 3D 模型——证明低速沉积层显著放大并重新分布转动地震动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：⚠️ 未验证（若为 SPECFEM3D 扩展实现，与谱元法波场模拟栈可能有接口价值）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;谱元法正演的数值扩展&lt;/strong&gt;，直接服务于 SPECFEM3D 生态——若项目使用谱元法栈，这是近期少见的直接相关条目；同时是&quot;传统数值方法持续产出&quot;的又一例证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ arXiv 元数据核验（转述自日报延伸观察节）；⚠️ 代码可用性未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9. Prior-free ISI：连续表示的无先验隐式地震反演&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（隐式连续表示）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：中国海洋大学&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;Geophysical Journal International&lt;/em&gt; · https://doi.org/10.1093/gji/ggag406（&lt;strong&gt;published-online 2026-10-05&lt;/strong&gt;，created 2026-10-01）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：用**连续表示（continuous representation）**做无需先验的隐式地震反演，降低计算负担。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：地震反演基准（详见全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;&quot;去掉先验依赖&quot;这个方向对跨工区迁移最友好&lt;/strong&gt;——不需要为每个新工区准备先验/预训练权重。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 期刊/DOI/机构核验；⚠️ 量化收益未验证、代码未声明。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10. 多参数黏弹性全波形反演（Q-FWI）用于 CO₂ 饱和度监测&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（黏弹性多参数 FWI；无 DL）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：UT Austin + SINTEF&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;Interpretation&lt;/em&gt; · https://doi.org/10.1190/int-2025-1037（&lt;strong&gt;published-online 2026-10-07&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：多参数黏弹性 FWI 定量反演 CO₂ 饱和度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：&lt;strong&gt;Sleipner OBN&lt;/strong&gt;（北海 CCS 示范场地）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;前 5 期 FWI 应用侧多为油气，CCUS 定量化为新增方向&lt;/strong&gt;。若涉及碳封存监测，这是本周唯一直接相关条目，且用的是公开示范场地（Sleipner）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 期刊/DOI/机构核验；⚠️ 量化精度与饱和度误差未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;断档补遗（2026-09-26 ~ 2026-09-30，主榜窗口之外的 5 天；含类别列）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;因上期日报为 09-25、本期为 10-08，中间 &lt;strong&gt;13 天&lt;/strong&gt;存在采集断档。日报第二节单列了这 5 天的 6 条期刊产出，本文件完整继承。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;来源&lt;/th&gt;
&lt;th&gt;日期（published）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;B1 ⭐&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Perturbation-Based Implicit FWI with Improved Optimization Conditioning&lt;/strong&gt;（摄动式 IFWI + 坐标归一化；中国海洋大学；测缺失低频）&lt;strong&gt;断档期最相关&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag403&lt;/td&gt;
&lt;td&gt;2026-09-30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;td&gt;Unsupervised erratic noise suppression in prestack gathers via PnP-ADMM with implicit neural representation（Calgary；⚠️ &lt;strong&gt;机构著录存疑&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI（PnP + INR）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2026-1753&lt;/td&gt;
&lt;td&gt;2026-09-30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B3&lt;/td&gt;
&lt;td&gt;Quasi-Global Search Behaviour of Large-Step Gradient-Based Optimization in FWI（KAUST）&lt;/td&gt;
&lt;td&gt;传统（优化方法）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1111/1365-2478.70265&lt;/td&gt;
&lt;td&gt;2026-09-29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B4&lt;/td&gt;
&lt;td&gt;Generative Diffusion Models for Geophysical Classification Problems（DiffClassNet；UT Austin BEG）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag383&lt;/td&gt;
&lt;td&gt;2026-09-28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B5&lt;/td&gt;
&lt;td&gt;Seismic Random Noise Suppression Based on Block Flattening BM3D（BFBM3D；中国地质大学武汉）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;传统&lt;/strong&gt;（BM3D 变体去噪）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1111/1365-2478.70262&lt;/td&gt;
&lt;td&gt;2026-09-27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B6&lt;/td&gt;
&lt;td&gt;Probabilistic inversion of electromagnetic data using Stein variational gradient descent（SVGD；MIT + Houston）&lt;/td&gt;
&lt;td&gt;传统（贝叶斯数值反演）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag392&lt;/td&gt;
&lt;td&gt;2026-09-26&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 补遗而非并入主榜的原因&lt;/strong&gt;：这 6 条的实际上线日落在 &lt;strong&gt;2026-09-26 ~ 09-30&lt;/strong&gt;，属于 &lt;strong&gt;W40（09-28 ~ 10-04）&lt;/strong&gt; 与前一周的交界，&lt;strong&gt;不在本期主窗口（10-01 ~ 10-08）内&lt;/strong&gt;。按周报口径，它们的&quot;应归周&quot;是 &lt;strong&gt;W39 末 / W40 初&lt;/strong&gt;，但因为 W40 无日报，只能在 W41 文件中以补遗形式保存。&lt;strong&gt;这是本文件最需要注意的口径点。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;若按&quot;应归周&quot;（W39 末 / W40 初）口径统计两类分布，断档补遗为 AI 3 条 + 传统 3 条&lt;/strong&gt;——传统方法在断档期期刊侧的产出密度与 W39 结论一致。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;本周提名区（被顶出主榜及延伸观察剩余条目；标注类别）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;来源&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;深度学习在大规模地震干扰压制中的实际应用：安哥拉 Camie 油田案例（345 km² 真实工区）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.09663&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;被顶出主榜&lt;/strong&gt;；⚠️ 机构未验证、处理时间数字未给出（需取 PDF）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;相邻 CRG 辅助多步深度学习框架做地震去混叠（同济大学）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1029/2026jh001391&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;被顶出主榜&lt;/strong&gt;；期刊/DOI/机构核验 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;基于谱归一化对抗学习的无监督物理约束速度反演（吉大+ETH+Harvard+浙大）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1093/gji/ggag418&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;被顶出主榜&lt;/strong&gt;；期刊/DOI/机构核验 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Twist Flow for Inverse Problems（Georgia Tech，Herrmann 组）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.09281&lt;/td&gt;
&lt;td&gt;与 #7 同组同日；针对&quot;后验欠覆盖/模态畸变&quot;，与 REG 互补&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Multi-Modal Surface Wave Inversion using Physics Guided VAE（UT Austin BEG）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.02337&lt;/td&gt;
&lt;td&gt;物理引导 VAE + Grad-CAM 解释 latent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;SeisDiff-FNO: FNO + 条件扩散做地震数据增强（KFUPM + KAUST）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1016/j.aiig.2026.100280&lt;/td&gt;
&lt;td&gt;Crossref/OpenAlex 均无摘要，&lt;strong&gt;仅方向信号&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;ISF-Unet：轻量 3D 地震断层分割网络（中国石油大学（北京）克拉玛依校区）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1190/int-2025-1008&lt;/td&gt;
&lt;td&gt;F3 / Kerry3D / 准噶尔盆地实际数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Conformal Prediction for Earthquake Early Warning（CQR 90% 名义下达 90.03% 覆盖）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1093/gji/ggag415&lt;/td&gt;
&lt;td&gt;本期唯一给出&quot;覆盖率达标&quot;硬数字的 UQ 工作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;多区域深度学习框架做低频地震检测（Kyoto University DPRI；Guerrero 地震空区 OBS）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1029/2026jh001455&lt;/td&gt;
&lt;td&gt;&quot;跨 6 构造域训练 → 单域标定 → 应用&quot;三段式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;DeepStratNet：稀疏标注下的地震层位追踪（改分割为有界坐标回归）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.02494&lt;/td&gt;
&lt;td&gt;机构未验证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;AI 辅助地质建模的条件化与解释工作流（Horizon Europe GO-Forward 项目）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.09871&lt;/td&gt;
&lt;td&gt;工业界&quot;成熟度&quot;表态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;开源地震栈双周复查：Devito / ObsPy / SeisBench 均无新 release（连续四期）&lt;/td&gt;
&lt;td&gt;传统（基础设施）&lt;/td&gt;
&lt;td&gt;GitHub Releases API 实测（2026-10-08）&lt;/td&gt;
&lt;td&gt;下次复查日 2026-10-22&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;四、本周全量条目索引（28 条位；含类别列）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;类别标注为本文件按&quot;分类口径&quot;对日报内容的重新归类，&lt;strong&gt;不改变日报原文&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;主榜 10 条（窗口 2026-10-01 ~ 10-08）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;GeoFWI3D: Large-scale 3D Velocity Model Dataset for DL-assisted Seismic Imaging&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2610.01033&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Diffusion Priors Enhanced VMB From Time-Lag Images Using a Neural Operator&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2025jh001223&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Coarse-to-fine multi-resolution hash encoding for implicit FWI（C2F-IFWI）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2610.01081&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Self-attention summary networks for subsurface VMB from CIGs&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2610.09282&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Robust Ensemble Guidance for Scientific Inverse Problems（REG）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2610.05371&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Unsupervised physics-constrained velocity inversion based on spectral normalization adversarial learning&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag418&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Prior-free implicit seismic inversion with continuous representation（ISI）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag406&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Multi-Parameter Viscoelastic FWI (Q-FWI) for CO2 Saturation Monitoring&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/int-2025-1037&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Seismic Deblending via an Adjacent-CRG-Assisted Multistep DL Framework&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2026jh001391&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Real-world application of DL in large-scale seismic interference attenuation（Camie field, Angola）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2610.09663&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;断档补遗 6 条（2026-09-26 ~ 09-30）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B1&lt;/td&gt;
&lt;td&gt;Perturbation-Based Implicit FWI with Improved Optimization Conditioning ⭐&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag403&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;td&gt;Unsupervised erratic noise suppression via PnP-ADMM with implicit neural representation&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2026-1753&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B3&lt;/td&gt;
&lt;td&gt;Quasi-Global Search Behaviour of Large-Step Gradient-Based Optimization in FWI&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1111/1365-2478.70265&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B4&lt;/td&gt;
&lt;td&gt;Generative Diffusion Models for Geophysical Classification Problems（DiffClassNet）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag383&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B5&lt;/td&gt;
&lt;td&gt;Seismic Random Noise Suppression Based on Block Flattening BM3D（BFBM3D）&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1111/1365-2478.70262&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B6&lt;/td&gt;
&lt;td&gt;Probabilistic inversion of electromagnetic data using SVGD&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag392&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;延伸观察 12 条（未进主榜，供追踪；其中 3 条已升入精选榜）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Twist Flow for Inverse Problems（Georgia Tech）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.09281&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Multi-Modal Surface Wave Inversion using Physics Guided VAE（UT Austin BEG）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.02337&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TREMOR: Template Matching for Large Seismic Data Collections（⭐ 已升入精选榜 #4）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;arXiv 2610.02534&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Spectral Element Extension for Direct Simulation of Rotational Ground Motions（⭐ 已升入精选榜 #8）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;arXiv 2610.09568&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;SeisDiff-FNO（FNO + 条件扩散）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1016/j.aiig.2026.100280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Robust 5D seismic data interpolation via memory-efficient group sparse Radon transform（⭐ 已升入精选榜 #6）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;10.1190/geo-2025-0371&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;ISF-Unet：轻量 3D 断层分割&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1190/int-2025-1008&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Conformal Prediction for Earthquake Early Warning&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1093/gji/ggag415&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;开源地震栈双周复查（无新 release，连续四期）&lt;/td&gt;
&lt;td&gt;传统（基础设施）&lt;/td&gt;
&lt;td&gt;GitHub Releases API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;多区域 DL 框架做低频地震检测（Kyoto DPRI）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1029/2026jh001455&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;DeepStratNet：稀疏标注层位追踪&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.02494&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;AI 辅助地质建模工作流（Horizon Europe 项目）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2610.09871&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;五、本周演化：重复 / 升级 / 新增方向（分两线）&lt;/h2&gt;
&lt;h3&gt;5.A AI/地球物理线&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;重复（本期检索再次命中）&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;前期位置&lt;/th&gt;
&lt;th&gt;本期判定&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Structure-Driven Methodology: An Emerging Cross-Domain Paradigm&lt;/strong&gt;（arXiv 2610.02698，2026-10-02）&lt;/td&gt;
&lt;td&gt;W39 期 09-21 主榜 #1（Structure-Driven Inversion，传统范式线）&lt;/td&gt;
&lt;td&gt;同一&quot;结构驱动&quot;范式的再表述，&lt;strong&gt;判定为重复，不进主榜&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SeisDiff-FNO&lt;/strong&gt;（10.1016/j.aiig.2026.100280）&lt;/td&gt;
&lt;td&gt;与 W39 期 09-24 主榜 #2「高低频协同 FNO 三维声波场」同属 FNO + 地震方向&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;方向重复&lt;/strong&gt;；且&lt;strong&gt;本期因拿不到摘要而方法未验证&lt;/strong&gt;，维持延伸观察&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;升级（前期&quot;信号&quot;→ 本期拿到可核验的新证据）&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;09-24 主榜 #2「高低频协同 FNO 三维声波场」→ 本期升级为&quot;有基准支撑的方向&quot;。&lt;/strong&gt; 本期 &lt;strong&gt;GeoFWI3D&lt;/strong&gt; 在 Technical Validation 章节中把 &lt;em&gt;4.5 Data-Driven Surrogate for Traveltime and Wavefield Prediction&lt;/em&gt; 与 &lt;em&gt;4.6 Training 3D Diffusion Models&lt;/em&gt; 列为&lt;strong&gt;正式的技术验证任务&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-23 主榜 #1「扩散式由浅到深速度建模」→ 本期出现同类范式的可核验落地版本。&lt;/strong&gt; JGR ML&amp;amp;C 的 &lt;strong&gt;10.1029/2025jh001223&lt;/strong&gt;（KAUST）给出&lt;strong&gt;完整摘要 + 完整机构 + 上线日期&lt;/strong&gt;，并明确做了 synthetic 与 field data 两个层面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐式 FWI（IFWI）从&quot;零星出现&quot;升级为&quot;本期主线&quot;。&lt;/strong&gt; 前 5 期 IFWI 只是偶发；本期&lt;strong&gt;一次性出现 3 条相互正交的 IFWI 改进&lt;/strong&gt;：多分辨率哈希由粗到精（主榜 #3）、摄动参数化（补遗 B1）、GAN 谱归一化（主榜 #6）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;本周新增方向&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;🆕 &lt;strong&gt;大规模 3D 速度模型开源基准数据集&lt;/strong&gt;（GeoFWI3D）——前 5 期主榜&lt;strong&gt;从未有&quot;数据集/基准&quot;类条目排在首位&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;🆕 &lt;strong&gt;IFWI 的&quot;由粗到精哈希激活&quot;与&quot;摄动参数化&quot;&lt;/strong&gt;——两条都&lt;strong&gt;不增加可训练参数&lt;/strong&gt;、都是参数化层面的改动。&lt;/li&gt;
&lt;li&gt;🆕 &lt;strong&gt;面向&quot;已训练好的生成式反演器&quot;的零成本后处理层&lt;/strong&gt;（REG 的 weighting + clipping；另有 Twist Flow 的 likelihood 侧坐标）——前 5 期未见此类&quot;采样器外科手术&quot;式工作。&lt;/li&gt;
&lt;li&gt;🆕 &lt;strong&gt;把 CIG（共成像点道集）从诊断量升格为条件变量&lt;/strong&gt;（self-attention summary network + conditional flow matching）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5.B 传统方法线&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;重复&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无本期新重复（上期传统线条目未在本窗口再次命中；SPBench 项目页仍挂账未复查——SPBench 本身为 AI 线）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;升级&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&quot;内存而非 FLOPs&quot;判据（W39 传统 HPC 线结论）在本期获得第三条独立佐证&lt;/strong&gt;：5D Radon 内存高效实现（避免物化完整 5D 数组）。该判据的跨周证据链现为：W39（TorchFDTD、Kokkos、Diff-NekRS、分布式 SVGD）→ W41（5D Radon）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开源栈生态的数值扩展仍在推进&lt;/strong&gt;（SPECFEM3D 转动分量扩展），尽管官方 release 连续四期零更新——&lt;strong&gt;&quot;工具链低活跃 ≠ 方法侧停滞&quot;&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;本周新增方向&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;🆕 &lt;strong&gt;黏弹性 Q-FWI 用于 CCUS 饱和度定量&lt;/strong&gt;（Interpretation，UT Austin + SINTEF）——前 5 期 FWI 应用侧多为油气，&lt;strong&gt;CCUS 定量化为新增&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;🆕 &lt;strong&gt;保证结果等价的大规模分布式模板匹配&lt;/strong&gt;（TREMOR，12× 且 exact）——区别于此前&quot;近似加速&quot;类 HPC 条目。&lt;/li&gt;
&lt;li&gt;🆕 &lt;strong&gt;谱元法直接模拟转动地震动&lt;/strong&gt;（PGRR 图）——转动分量模拟首次进入本系列视野。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5.C 两线交叉观察&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统方法在延伸观察区富集（6/12）&lt;/strong&gt;，与 W39&quot;期刊侧是传统方法富矿&quot;结论同源——延伸观察的来源同样以期刊为主（5D Radon〔Geophysics〕、SPECFEM 扩展〔arXiv〕、开源栈复查〔GitHub 实测〕）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;断档补遗的 6 条中传统方法占 3 条&lt;/strong&gt;（B3 大步长优化、B5 BFBM3D、B6 SVGD 电磁）——断档期的期刊产出延续 W39 的传统方法密度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 线的&quot;零成本改良&quot;主线（主线 1）与传统线的&quot;内存工程&quot;主线（主线 4）是同一算力约束的两面&lt;/strong&gt;：前者绕开算力需求，后者降低算力需求。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;六、本周趋势总结（分两线）&lt;/h2&gt;
&lt;h3&gt;6.A AI/地球物理线&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本期最突出的信号：隐式/生成式 FWI 从&quot;提出方法&quot;转向&quot;工程化改良&quot;，且改良的共同特征是&quot;低/零额外成本&quot;。&lt;/strong&gt; 主榜 10 条中 6 条落在此带。领域已过&quot;堆大模型&quot;阶段，进入&quot;如何把已有的生成式/隐式表示接进物理流程而不炸&quot;的阶段。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二条主线：基础设施终于出现。&lt;/strong&gt; GeoFWI3D 与 SPBench 互补——&lt;strong&gt;前者提供可用来规范评测的东西，后者指出评测不规范。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三条：扩散模型在地球物理里的角色已分化成三种&lt;/strong&gt;（生成器/先验、正则化器、多尺度特征提取器）。&lt;strong&gt;只当&quot;又一个生成式反演器&quot;会低估它。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 诚实性问题：本期主榜 10 条中只有 1 条给出可直接引用的量化数字。&lt;/strong&gt; 其余各条收益表述几乎全是定性的。&lt;strong&gt;这意味着本期的&quot;进展&quot;更像方向确认而非性能突破。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.B 传统方法线&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;传统方法条目在延伸观察区富集（6/12），且本期&quot;最接近真 HPC&quot;的三条全部是传统方法线&lt;/strong&gt;（TREMOR 分布式模板匹配、5D Radon 内存高效、SPECFEM3D 扩展）。叠加开源栈连续四期零 release，&lt;strong&gt;HPC 能力仍需自建&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;内存而非 FLOPs&quot;判据获得跨周第三、四条独立佐证&lt;/strong&gt;（5D Radon 避免物化完整数组；TREMOR 处理超出单机内存的集合）——该判据已可视为传统 HPC 线的&lt;strong&gt;稳定结论&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CCUS 定量化（Q-FWI + Sleipner OBN）为传统 FWI 应用侧的新增方向&lt;/strong&gt;——与 AI 线无关，纯物理建模能力驱动的扩展。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;断档期（09-26~09-30）期刊产出中传统方法占一半&lt;/strong&gt;（B3/B5/B6），再次印证&quot;期刊侧是传统方法富矿&quot;（W39 结论第三次成立）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.C 综合判断&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;本周两线产出比约 19:9（AI:传统），但主榜原序口径下为 9:1——传统方法在本期被&quot;检索口径 + 单采集点 + 半周窗口&quot;三重因素压到了延伸观察区。&lt;/strong&gt; 升入 3 条后配比恢复为 6:4，但必须说明：&lt;strong&gt;这是整理动作对检索口径偏差的补偿，不是传统方法真实产出密度的下降。&lt;/strong&gt; 事实上延伸观察 + 断档补遗中的传统方法条目数（9 条）与 AI 线的差距远小于主榜呈现的 9:1。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;七、对项目的行动建议（本周）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;课题口径仍为默认的 &lt;strong&gt;AI + HPC + 地震数据处理 + FWI&lt;/strong&gt;。以下均为建议，&lt;strong&gt;未执行任何操作&lt;/strong&gt;。括号内为所属线别。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;A. 立即可做（低风险、低成本，1–3 天）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;下载并核对 GeoFWI3D 数据体量&lt;/strong&gt;——DOI &lt;code&gt;10.5281/zenodo.20148778&lt;/code&gt; 已实测可解析、CC BY 4.0。&lt;strong&gt;先确认体量与格式，再决定是否作为内部 3D 代理模型评测底座&lt;/strong&gt;（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;给现有扩散反演器加一层 REG 式 post-processing&lt;/strong&gt;（weighting + clipping）做可行性验证——&lt;strong&gt;零额外 denoiser/forward 调用&lt;/strong&gt;，是本周期性价比最高的一条工程化改良（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把 GeoFWI3D 的 Technical Validation 任务清单（4.5 走时/波场代理、4.6 3D 扩散）转成内部评测 checklist&lt;/strong&gt;——它代表社区认可的&quot;能力项&quot;（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把 IFWI 三条正交改良（哈希激活 / 摄动参数化 / 谱归一化）列为对现有 INR 反演管线的可选改动&lt;/strong&gt;，&lt;strong&gt;优先级按&quot;改动量从小到大&quot;排序&lt;/strong&gt;（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在下次数据规整任务中评估&quot;避免物化完整数组&quot;模式&lt;/strong&gt;（5D Radon 的跨频率片顺序累加）能否用于现有大规模数据体处理（传统/HPC 线）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;B. 需要评估（有收益但需先做可行性判断，1–4 周）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;评估 Q-FWI 用于 CCUS 监测的可行性&lt;/strong&gt;——Sleipner OBN 是公开示范场地，可先做数据可获取性调研（传统线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估&quot;Prior-free ISI&quot;对跨工区迁移的价值&lt;/strong&gt;——去掉先验依赖意味着不需要为每个新工区准备先验/预训练权重（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估 CIG 作为条件变量的通用性&lt;/strong&gt;（自注意力 summary network + flow matching），看能否接入现有速度建模流程（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估 TREMOR 式&quot;保证等价的分布式处理&quot;对内部大规模波形任务的适用性&lt;/strong&gt;——exact + 12× 的组合在需要可复现性的场景价值高（传统/HPC 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估 Camie 油田案例的处理时间收益&lt;/strong&gt;——⚠️ &lt;strong&gt;需先取 PDF&lt;/strong&gt;，摘要未给出时间对比数字（AI 线）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;C. 仅记录（暂不投入）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Structure-Driven 范式的再次表述&lt;/strong&gt;（arXiv 2610.02698，传统范式线）——已判定为重复，维持季度级跟踪。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SeisDiff-FNO（10.1016/j.aiig.2026.100280）&lt;/strong&gt;（AI 线）——Crossref / OpenAlex 均无摘要，&lt;strong&gt;仅为方向信号&lt;/strong&gt;，作者组合可信，可设提醒。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;Twist Flow 的 likelihood 侧坐标&quot;&lt;/strong&gt;（AI 线）——同属零成本后处理层，与 REG 一并跟踪。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;D. HPC 侧的具体提醒&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;开源栈复查结论（本次为双周复查日）&lt;/strong&gt;：Devito v4.8.23 / 2026-08-07；ObsPy 1.5.1 / 2026-08-28；SeisBench v0.12.0 / 2026-06-24——&lt;strong&gt;均无新版本，连续四期成立&lt;/strong&gt;。&lt;strong&gt;下次到期复查日：2026-10-22。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;延伸观察中的 HPC 线索&quot;单独建追踪列表&lt;/strong&gt;——本期已通过&quot;延伸观察升入精选榜&quot;动作部分解决（TREMOR、5D Radon、SPECFEM 扩展进榜），后续每期延续该机制，避免传统 HPC 条目反复停留在观察区。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;继续保持&quot;内存而非 FLOPs&quot;作为硬约束&lt;/strong&gt;（5D Radon 避免物化完整 5D 数组，与 W39 判据同源，本期为第三条独立佐证）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;八、未解决项 / 需人工确认&lt;/h2&gt;
&lt;h3&gt;8.1 本期新增的未验证项&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;缺口&lt;/th&gt;
&lt;th&gt;建议处理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GeoFWI3D&lt;/strong&gt;（2610.01033）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;论文第 6 节 &quot;Code availability&quot; 在 arXiv HTML 中&lt;strong&gt;为空&lt;/strong&gt;，未解析出代码 URL；数据集体量/格式未验证&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;⭐ 最高优先级&lt;/strong&gt;：取 PDF 版或联系通讯作者确认代码地址；下载后核对体量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;C2F-IFWI&lt;/strong&gt;（2610.01081）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;脚注 1（Linrong Wang、Fan Min）机构未解析&lt;/td&gt;
&lt;td&gt;取 PDF 版看脚注；或按作者名检索机构主页&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;REG&lt;/strong&gt;（2610.05371）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;机构未验证（HTML 404，API 无 affiliation）；代码未验证&lt;/td&gt;
&lt;td&gt;等 arXiv 生成 HTML 后复查&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TREMOR&lt;/strong&gt;（2610.02534）&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;12× 加速为作者自述；代码未验证&lt;/td&gt;
&lt;td&gt;⚠️ 本条自延伸观察升入精选榜，&lt;strong&gt;升入依据为日报延伸观察节原文&lt;/strong&gt;，量化数字未复核&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5D Radon 插值&lt;/strong&gt;（10.1190/geo-2025-0371）&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;合成上&quot;优于 POCS 与 DRR&quot;的具体指标未给出&lt;/td&gt;
&lt;td&gt;同上，升入依据为日报原文；量化数字需读全文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Camie 油田 SI 压制&lt;/strong&gt;（2610.09663）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;机构未验证（HTML 404）；&lt;strong&gt;处理时间对比的具体数字未给出&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;同上；时间对比数字是本条最重要的信息，&lt;strong&gt;建议取 PDF&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SeisDiff-FNO&lt;/strong&gt;（10.1016/j.aiig.2026.100280）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Crossref 与 OpenAlex &lt;strong&gt;均无摘要&lt;/strong&gt;，方法完全未验证&lt;/td&gt;
&lt;td&gt;等全文上线；作者组合可信，可设提醒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.1190/geo-2024-0841&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;与 geo-2026-1753 同标题，但 Crossref 摘要内容为&quot;荔湾凹陷 OBS + 拖缆速度建模&quot;，明显错配&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;判定为重复/错配记录&lt;/strong&gt;，以 geo-2026-1753 为准；需人工在 SEG 平台确认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;geo-2026-1753 机构著录存疑&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI（PnP-INR）&lt;/td&gt;
&lt;td&gt;Crossref 把 Daniel Trad 标为西安交通大学，与其长期任职 Calgary 矛盾&lt;/td&gt;
&lt;td&gt;疑似 affiliation 索引错位，需人工确认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JAG / C&amp;amp;G 多条&lt;/strong&gt;（106382、106403、106406、106392、106415 等）&lt;/td&gt;
&lt;td&gt;混合&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Crossref 无摘要&lt;/strong&gt;；且 &lt;code&gt;created&lt;/code&gt; 为 2026-06/07、&lt;strong&gt;仅 &lt;code&gt;published&lt;/code&gt; 落在 2026-10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;日期口径存疑&lt;/strong&gt;（可能是 10 月号而非 10 月新上线），故未进主榜。若需纳入，需人工到 Elsevier 平台确认上线日期&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;8.2 跨期悬置项（多日未解决，需人工介入）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SPBench 项目页&lt;/strong&gt; &lt;code&gt;https://seismicprocessingbenchmark.github.io/SPBench/&lt;/code&gt; —— W39 期 09-25 v2 已降级为&lt;strong&gt;每周复查&lt;/strong&gt;，&lt;strong&gt;本期未复查，继续挂账&lt;/strong&gt;。地址已由论文图注确证，页面未上线。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4 篇 Springer &lt;em&gt;Applied Geophysics&lt;/em&gt; 条目仍需批量取 PDF&lt;/strong&gt;：10.1007/s11770-026-1617-5（GPR FWI 初始模型，传统）、10.1007/s11770-026-1608-6（ViT 重力反演，AI）、10.1007/s11770-026-1616-6（Radon-FISTA，传统）、10.1007/s11770-026-1547-2（Kalman 走时反演，传统）。&lt;strong&gt;Springer 不提供结构化摘要，API 路径已走到尽头，只能人工取 PDF。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10.1007/s11770-026-1587-7&lt;/strong&gt;（U-Net 三维重力反演）—— W39 期 09-25 v2 已建议&lt;strong&gt;停止跟踪&lt;/strong&gt;，本期不再复查。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSDB&lt;/strong&gt;（10.1016/j.eqs.2026.06.001，全球 Raspberry Shake 波形数据集）—— 机构/摘要/数据地址全缺，日期口径冲突（published [2026,10] vs created 2026-09-23）。&lt;strong&gt;本期 Earthquake Science 扫描再次命中，仍未解决。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic FWI 摘要&lt;/strong&gt;（10.1007/s11004-026-10342-5）、&lt;strong&gt;&lt;em&gt;Science China&lt;/em&gt; 生成式 AI 综述摘要&lt;/strong&gt;（10.1007/s11430-025-2038-7）、&lt;strong&gt;伴随法小震矩释放率摘要&lt;/strong&gt;（rs-3.rs-10679490/v1）、&lt;strong&gt;BicycleGAN 日期冲突&lt;/strong&gt;（10.1016/j.cageo.2026.106272）——&lt;strong&gt;均跨期 ≥3 期未推进&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;8.3 本周口径层面的新教训（务必记住）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;教训&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⚠️ 断裂周期需单列补遗&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;上期 09-25、本期 10-08，&lt;strong&gt;间隔 13 天&lt;/strong&gt;且中间 W40 无日报。&lt;strong&gt;处理口径：主榜严格按 7 天窗口编制，断档区间单列&quot;补遗&quot;，并标注其&quot;应归周&quot;是 W39 末 / W40 初。&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⚠️ &quot;同标题双 DOI&quot;需主动查重&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Geophysics&lt;/em&gt; 的 &lt;code&gt;geo-2024-0841&lt;/code&gt; 与 &lt;code&gt;geo-2026-1753&lt;/code&gt; &lt;strong&gt;标题相同&lt;/strong&gt;，但前者 Crossref 摘要实为&quot;荔湾凹陷 OBS 速度建模&quot; → &lt;strong&gt;错配记录&lt;/strong&gt;。&lt;strong&gt;下期对进主榜条目额外按标题做一次 Crossref 查重。&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⭐ 传统方法配比不足时的处理范式（本期确立）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;主窗口可验证传统条目不足 4 条时：① 从延伸观察升入可验证条目并逐条注明升入依据；② 断档补遗中的传统条目标注类别备用；③ 明确说明&quot;不足原因&quot;（检索口径偏向 AI + 单采集点），&lt;strong&gt;不凑数、不降验证标准&lt;/strong&gt;。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⭐ 新路径：arXiv HTML 404 时用&quot;同组已出版论文&quot;的 Crossref 机构字段反推 affiliation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;本期 2610.01081 的 KAUST 由同组 10.1111/1365-2478.70265（Shaowen Wang / Alkhalifah）确证。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Crossref 429 加剧&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;请求间隔需 ≥2.5 s + 3 次重试（1.2 s 不够）。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;arXiv HTML 可用率下降&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;本窗口 12 篇中 7 篇 HTML 404 → &lt;strong&gt;必须配 arXiv API &lt;code&gt;id_list&lt;/code&gt; 兜底取摘要/作者&lt;/strong&gt;。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;期刊侧继续主导&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;主榜 6/10 来自期刊，补遗 6/6 全部来自期刊。&lt;strong&gt;再次确认 ISSN 区间扫描优先于 arXiv &lt;code&gt;cat:&lt;/code&gt; 检索。&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;8.4 需人工确认的性能数字&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;本期主榜 10 条中只有 1 条（REG）给出可直接引用的量化数字&lt;/strong&gt;（PSNR +6.2–8.2 dB、NS 误差 −26.4%）；其余 9 条摘要&lt;strong&gt;全是定性表述&lt;/strong&gt;。升入精选榜的 TREMOR（12× exact）与 5D Radon（优于 POCS/DRR）同样为&lt;strong&gt;作者自述、未复核&lt;/strong&gt;。已逐条在日报中标注，&lt;strong&gt;未做任何数字推测&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;九、检索说明与本文件生成方式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本文件不是检索产物&lt;/strong&gt;。生成过程为：读取 &lt;code&gt;AI每日总结_2026-10-08.md&lt;/code&gt;（主榜 10 条 + 断档补遗 6 条 + 延伸观察 12 条）→ 按 ISO 周归入 W41 → 抽取该期的&quot;〇 对比&quot;&quot;趋势总结&quot;&quot;未解决项&quot; → &lt;strong&gt;按&quot;AI/地球物理 + 传统方法&quot;两分类重新归类并标注&lt;/strong&gt; → 因主窗口传统条目不足 4 条，&lt;strong&gt;自延伸观察升入 3 条可验证传统方法条目&lt;/strong&gt;（TREMOR、SPECFEM3D 转动分量、5D Radon），被顶出的 3 条 AI 条目移入提名区 → 输出本文件。&lt;strong&gt;未访问任何外部数据源。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两类条数分布&lt;/strong&gt;：28 条位中 &lt;strong&gt;AI/地球物理 19 条 / 传统方法 9 条&lt;/strong&gt;（主榜 9:1；补遗 4:2；延伸观察 6:6）。精选 Top 10 配比 &lt;strong&gt;6:4&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 传统方法不足 4 条的原因与处理&lt;/strong&gt;：主窗口主榜原仅 1 条传统方法（Q-FWI）。原因有三：① 本周仅 10-08 一个采集点、窗口仅 8 天；② 日报检索口径以&quot;AI + 地球物理&quot;为主，传统条目天然富集于延伸观察；③ W40 整周空缺使断档期期刊产出（传统方法密度高的来源）只能以补遗形式存在。&lt;strong&gt;处理：从延伸观察升入 3 条（TREMOR / SPECFEM3D 扩展 / 5D Radon），全部为可验证条目、逐条注明升入依据；未凑数、未降低验证标准。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;历史重复/升级/新增&lt;/strong&gt;：重复 2 条（SDI 范式再表述〔传统〕、SeisDiff-FNO 方向重复〔AI〕）；升级 3 项（FNO 方向获基准支撑〔AI〕、扩散 VMB 获可核验版本〔AI〕、内存判据获第三条佐证〔传统〕）；新增方向 AI 线 4 项 + 传统线 3 项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 2026-10-08 变更&lt;/strong&gt;：按用户要求，本期日报 &lt;code&gt;AI每日总结_2026-10-08.md&lt;/code&gt; 已随全部 12 份历史日报移出主目录，现留存于工作区 &lt;code&gt;.回收站_日报_2026-10-08/&lt;/code&gt; 与外部备份 &lt;code&gt;/home/liguolong/geo_scratch/backup_日报_2026-10-08/&lt;/code&gt;（删除前校验一致）。&quot;回溯入口&quot;请改到上述两处查阅。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 本文件的覆盖不完整，需在下一期补齐的部分&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;W40（09-28 ~ 10-04）整周无日报&lt;/strong&gt;——该周的期刊产出（尤其 10-01 ~ 10-04 段）可能未被完整捕获；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;W41 内 10-09 ~ 10-11 无采集&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;断档补遗 6 条的&quot;应归周&quot;是 W39 末 / W40 初，本文件仅为保存处，&lt;strong&gt;周口径上存在跨周漂移&lt;/strong&gt;。
&lt;strong&gt;建议：下一期日报生成时，把检索窗口显式设为&quot;自上期日报日至今&quot;，避免再次出现 13 天断档。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;归并口径声明&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;周划分 = ISO 周（周一~周日）。&lt;/li&gt;
&lt;li&gt;本周仅一个采集点，主榜原序不重排；&lt;strong&gt;精选榜为满足 6:4 配比做了一次重排（升入 + 顶出），已在配比说明中逐条注明&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;诚实性声明&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;所有链接、作者、机构、日期、数字&lt;strong&gt;均转述自日报原文&lt;/strong&gt;；日报未验证的一律沿用&quot;未验证/需人工确认&quot;标注，&lt;strong&gt;本文件未做任何新推断或补齐&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;日报中标为&quot;企业新闻口径&quot;&quot;二手来源&quot;&quot;推断&quot;的内容，&lt;strong&gt;在本文件中保持原标注&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;front matter 说明&lt;/strong&gt;：周报使用 &lt;code&gt;tags&lt;/code&gt; / &lt;code&gt;category&lt;/code&gt; 均为 &lt;code&gt;&quot;AI每周总结&quot;&lt;/code&gt;。若站点分类体系需要与日报保持一致，请把 &lt;code&gt;category&lt;/code&gt; 改为 &lt;code&gt;&quot;AI每日总结&quot;&lt;/code&gt;，其余字段不变。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只读优先&lt;/strong&gt;：本文件生成过程未执行任何写入以外的操作，未提交、未删除、未覆盖任何既有文件。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AI每周总结-地球物理（2026-W39）</title><link>https://tuoyuangui.github.io/website/posts/typora/ai%E6%AF%8F%E6%97%A5%E6%80%BB%E7%BB%93/ai%E6%AF%8F%E5%91%A8%E6%80%BB%E7%BB%93_2026-w39/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/ai%E6%AF%8F%E6%97%A5%E6%80%BB%E7%BB%93/ai%E6%AF%8F%E5%91%A8%E6%80%BB%E7%BB%93_2026-w39/</guid><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AI每周总结 · 地球物理（2026-W39：2026-09-21 ~ 2026-09-27）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;📌 分类口径（本期起生效）&lt;/strong&gt;：&lt;strong&gt;AI/地球物理&lt;/strong&gt; = 以深度学习/机器学习/神经网络/生成模型/强化学习等为核心创新；&lt;strong&gt;传统方法&lt;/strong&gt; = 以物理/数学/数值/信号处理/反演/成像/层析等为核心，不以 DL/ML 为主要创新（AI 仅作辅助，或 ML 框架仅作计算工具、无学习组件）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;一、本周概览&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;覆盖区间&lt;/td&gt;
&lt;td&gt;2026-09-21 ~ 2026-09-27（2026-W39）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日报份数&lt;/td&gt;
&lt;td&gt;5（09-21、09-22、09-23、09-24、09-25〔v1+v2〕）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主榜单条位&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60 条位&lt;/strong&gt;（09-25 双版本贡献 20 条）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;去重后独立条目&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;约 57 条&lt;/strong&gt;（3 条为跨期重复命中：SDI、ES-MDA-A2、HFNO）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;两类分布（条位）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AI/地球物理 39 / 传统方法 21&lt;/strong&gt;；传统方法密度在 09-25 v2（期刊侧扫描日）达到峰值（7/10）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⭐ 本周最大事件&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;连续 8 天的 HPC 缺口在 09-22 终结&lt;/strong&gt;，且形态从&quot;系统/工作流&quot;演化到&quot;算法并行化&quot;再到&quot;内存/显存工程&quot;——&lt;strong&gt;注意：本周 HPC 增量大部分落在传统方法线&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⭐ 本周第二条主线&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;评测口径/可复现性&lt;/strong&gt;从单条警示升级为当日主线（09-25 SPBench + v2 独立佐证）——&lt;strong&gt;AI 线的内部清算&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可复现资产&lt;/td&gt;
&lt;td&gt;GRADSOLVE（GitHub，MIT，传统/可微）、TorchFDTD（论文，传统/HPC）、SPBench（&lt;strong&gt;地址已确证但页面 404&lt;/strong&gt;，AI）、PINN Atlas / SVGDFWI（延续上周）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开源地震栈&lt;/td&gt;
&lt;td&gt;Devito / SPECFEM3D / SeisSol &lt;strong&gt;全周无新 release&lt;/strong&gt;（本系列连续多期确认）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;来源结构翻转&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;09-25 v2 首次由期刊侧反超&lt;/strong&gt;：10 条中 8 条来自正式期刊（&lt;em&gt;Geophysics&lt;/em&gt;×2、&lt;em&gt;Frontiers in Earth Science&lt;/em&gt;×2、&lt;em&gt;Applied Geophysics&lt;/em&gt;×3、&lt;em&gt;Earthquake Science&lt;/em&gt;×1），原因是 &lt;code&gt;issn:&lt;/code&gt; 区间扫描命中了 &lt;code&gt;cat:&lt;/code&gt; 覆盖不到的期刊——&lt;strong&gt;期刊侧同时是传统方法条目的主要来源&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;二、本周主线（跨日归并，8 条；每条标注所涉类别）&lt;/h2&gt;
&lt;h3&gt;主线 1 ·【传统方法·HPC】⭐ HPC 缺口的终结，以及它的三段式演化&lt;/h3&gt;
&lt;p&gt;这是本周（也是本系列）最重要的结构变化。前 6 天（09-15 ~ 09-21）持续记录&quot;HPC 侧无系统/方法学产出&quot;，09-21 甚至建议把 HPC 源检查&lt;strong&gt;降频为每周一次&lt;/strong&gt;。本周发生了清晰的三段演化：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;日期&lt;/th&gt;
&lt;th&gt;代表条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;形态&lt;/th&gt;
&lt;th&gt;关键数字&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;① 系统/工作流&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-22 #1&lt;/td&gt;
&lt;td&gt;资源采集式 HPC 工作流（arXiv 2609.22814，已被第八届 Interactive and Urgent HPC 研讨会接收）&lt;/td&gt;
&lt;td&gt;传统（HPC 系统，NN 为工作流组件）&lt;/td&gt;
&lt;td&gt;算力&lt;strong&gt;时间&lt;/strong&gt;维度复用：平时空闲算力建 NN 训练集，震时切换到&quot;NN 反演 + 物理模拟 + 动态加密&quot;&lt;/td&gt;
&lt;td&gt;能耗 &lt;strong&gt;−76%&lt;/strong&gt;、吞吐 &lt;strong&gt;3.7×&lt;/strong&gt;、应急成本 &lt;strong&gt;−97.9%&lt;/strong&gt;、震后 &lt;strong&gt;30 分钟&lt;/strong&gt;出图（⚠️ 全部为摘要自述）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;② 算法并行化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-23 #2&lt;/td&gt;
&lt;td&gt;分布式近端 SVGD 走时层析（arXiv 2609.26653）&lt;/td&gt;
&lt;td&gt;传统（贝叶斯数值反演；SVGD 无神经网络）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;共识型 ADMM + worker 内 SVGD&lt;/strong&gt;，用 Woodbury 恒等式导出数据空间 GN 更新；声称无需显式构造大规模敏感矩阵&lt;/td&gt;
&lt;td&gt;⚠️ &quot;降低 3D 内存占用&quot;为&lt;strong&gt;定性表述，无倍数&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;③ 内存/显存工程&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-24 #1/#4、09-25 #3/#4&lt;/td&gt;
&lt;td&gt;MENO、Kokkos FE 核、TorchFDTD、Diff-NekRS、GRADSOLVE、&quot;Beyond Compression&quot;&lt;/td&gt;
&lt;td&gt;AI 1 条（MENO）+ 传统 4 条&lt;/td&gt;
&lt;td&gt;显存与分辨率解耦 / 性能由装配如何映射到存储层次决定 / 全局状态与 checkpoint 换出主机内存&lt;/td&gt;
&lt;td&gt;TorchFDTD：&lt;strong&gt;2.7–3.1× 时间换 56%–65% 峰值显存&lt;/strong&gt;，&lt;strong&gt;离散格式不变&lt;/strong&gt;；稀疏 FFT：&lt;strong&gt;2.9–11.6× 显存收益&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;本周形成的核心判断&lt;/strong&gt;：&lt;strong&gt;大型 3D 地震计算的约束条件是内存，不是 FLOPs。&lt;/strong&gt; 本周共有 &lt;strong&gt;6 条以上独立来源&lt;/strong&gt;指向同一结论，足以作为内部架构选型的&lt;strong&gt;硬约束&lt;/strong&gt;写入。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二条判据&lt;/strong&gt;：&lt;strong&gt;融合 CUDA 核与自动微分不兼容&lt;/strong&gt;被两条独立来源点名——TorchFDTD（光子 FDTD）与 Diff-NekRS（不可压 CFD，Argonne，1020 MPI ranks）都选择&lt;strong&gt;手工实现精确离散伴随&lt;/strong&gt;而非让 AD 穿透核函数，并分别用&quot;与中心差分相差 0.78%&quot;和&quot;端到端 Taylor 检验&quot;验证。Diff-NekRS 的措辞尤其关键：&lt;strong&gt;对&quot;完全离散的时间步&quot;求导（discretize-then-optimize）&lt;/strong&gt;。&lt;strong&gt;结论：只要正演有手写 CUDA 核，就别指望 AD，必须准备转置核。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 但必须清醒&lt;/strong&gt;：三个开源地震栈&lt;strong&gt;仍无新 release&lt;/strong&gt;。&lt;strong&gt;HPC 增量来自研究方法侧，而非开源工具侧——短期只能靠自己实现论文中的并行架构。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;主线 2 ·【AI/地球物理】⭐ 评测口径与可复现性：本周从&quot;某条警示&quot;升级为&quot;当日主线&quot;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;09-21 #4 PosteriorBench&lt;/strong&gt;（arXiv 2609.20794）：用拒绝采样/MCMC 造参考后验，一次给出 &lt;strong&gt;5 项分布匹配指标&lt;/strong&gt;，并开源代码。其自陈结论&quot;当前解法普遍存在显著后验匹配差距&quot;，是对 09-19/09-20 那批扩散先验 FWI 工作&lt;strong&gt;最直接的一次压力测试&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-21 #5&lt;/strong&gt;：把去噪评价从波形误差&lt;strong&gt;延伸到下游任务&lt;/strong&gt;（检测率、到时拾取、初动极性），并做分布外测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-25 #1 SPBench&lt;/strong&gt;（arXiv 2609.28925）：审计 &lt;strong&gt;368 篇论文发现仅 25 篇公开代码&lt;/strong&gt;，并给出**&quot;合成排名不能可靠预测实测排名&quot;**的实测结论。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-25 v2 #2 泄漏感知全剖面评估 + 半监督地震相分割&lt;/strong&gt;（10.3389/feart.2026.1910345）：用 &lt;strong&gt;F3 / Parihaka 两个公开数据集&lt;/strong&gt;独立证明**&quot;架构差异小于随机种子差异&quot;&lt;strong&gt;，并把泄漏来源&lt;/strong&gt;精确定位到&quot;重叠 patch 的随机切分&quot;**。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-23 #3 / #6&lt;/strong&gt;：成本—精度失效边界；全局指标在带外尾部偏移处&lt;strong&gt;可能系统性误导&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-25 #2 独立佐证&lt;/strong&gt;：&lt;em&gt;Applied Sciences&lt;/em&gt; 的 operator-budget 工作指出&lt;strong&gt;等优化步数比较会掩盖采样提议的额外残差开销&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;行动结论（两条独立来源一致且可执行）&lt;/strong&gt;：&lt;strong&gt;先修评测协议（整剖面切分 + buffer gap + 多种子），再谈架构创新。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;主线 3 ·【AI/地球物理】扩散 × FWI：从&quot;后验采样/正则化&quot;推进到&quot;工序级替代&quot;，并拿到实测泛化证据&lt;/h3&gt;
&lt;p&gt;本系列自 09-15 起跟踪该簇（PSG 后验采样 → SVGDFWI 粒子变分 → GPR 扩散正则化 → 本周 #1 深度渐进 VMB）。本周的位置变化在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;09-23 #1 Shallow-to-deep VMB via diffusion（Part I + Part II）&lt;/strong&gt;（arXiv 2609.26454 / 2609.26482）：&lt;strong&gt;不再把扩散当正则化或采样器，而是直接替代&quot;速度模型建立&quot;这道工序&lt;/strong&gt;。Part II 用&quot;迁移派生属性 + 层析背景 + 稀疏井&quot;这套&lt;strong&gt;真实可得的条件组合&lt;/strong&gt;，在&lt;strong&gt;实测数据&lt;/strong&gt;上完成闭环（⚠️ KAUST 为推断，代码/数据/同行评议状态未验证）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-25 #2 HFNO&lt;/strong&gt;（10.1016/j.jappgeo.2026.106528）—— 见&quot;主线 4&quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;判断&lt;/strong&gt;：若 09-23 #1 的结论成立，这是本系列跟踪以来该方向&lt;strong&gt;最接近可落地的一次&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;主线 4 ·【AI/地球物理】神经算子的&quot;边界&quot;被系统性界定，且首次拿到可量化的正演加速&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;四条独立证据构成完整的三角：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;结论&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;成本—精度失效边界&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-23 #3（arXiv 2609.24021）&lt;/td&gt;
&lt;td&gt;在刻意对神经算子有利的设定下（训练成本完全摊销），&lt;strong&gt;仍存在经典求解器胜出的区间&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OOD 可审计诊断&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-23 #6（arXiv 2609.23529）&lt;/td&gt;
&lt;td&gt;能量范数误差分解为&quot;模型谱近似项&quot;与&quot;输入分布谱加权项&quot;，&lt;strong&gt;诊断量无需真值即可计算&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;价值重定位&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-24 #3（arXiv 2609.24947）&lt;/td&gt;
&lt;td&gt;核心论点：&lt;strong&gt;神经算子不需要准，只需要把优化放进正确的解盆地&lt;/strong&gt;；用 Allen-Cahn 展示&quot;残差很小但收敛到错误分支&quot;——&lt;strong&gt;与 FWI 的 cycle skipping 是同一命题的两种语言&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;长时程稳定性 + 梯度一致性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-25 #5（arXiv 2609.30198）、09-25 v2 KATOsuper&lt;/td&gt;
&lt;td&gt;改善长 rollout 稳定性会让常规训练指标&lt;strong&gt;变差&lt;/strong&gt;；&lt;strong&gt;预测梯度必须与预测目标场自洽&lt;/strong&gt;，否则基于梯度的优化不稳定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;正面证据&lt;/strong&gt;：&lt;strong&gt;09-24 #2 / 09-25 #2 HFNO&lt;/strong&gt;（10.1016/j.jappgeo.2026.106528，CNPC + 吉林大学）。09-24 期只拿到 DOI/作者/机构（无摘要），09-25 期通过 OpenAlex 直查取到完整摘要，&lt;strong&gt;首次拿到量化结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：标准 FNO 在谱处理中截断高频模式 → 增设&lt;strong&gt;专用高频 Fourier 分支&lt;/strong&gt;做显式频段选择；另提出&lt;strong&gt;时权因果损失&lt;/strong&gt;把声波传播的因果性嵌入训练目标。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：三个地质复杂度递增的基准，最难一档为 &lt;strong&gt;SEG-Combined（SEG/EAGE Salt + Overthrust 拼合）&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化&lt;/strong&gt;：三数据集上 &lt;strong&gt;HER（高频能量比误差）全部最低&lt;/strong&gt;；相对标准 FNO 基线&lt;strong&gt;最多降低 HER 误差 33%&lt;/strong&gt;；&lt;strong&gt;CPU 单次正演 1.34 s、相对同硬件 Devito 有限差分 3× 加速&lt;/strong&gt;；&lt;strong&gt;GPU 0.0094 s/次&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 日期口径&lt;/strong&gt;：OpenAlex &lt;code&gt;publication_date&lt;/code&gt; = 2026-09-18；Crossref &lt;code&gt;created&lt;/code&gt; = 2026-09-18；Crossref &lt;code&gt;published&lt;/code&gt; = &lt;strong&gt;2026-12&lt;/strong&gt;（卷期归属月）。&lt;strong&gt;这是本系列 11 期以来唯一一条同时满足「神经算子 + 三维地震正演 + 中文单位 + 有量化加速比」的条目。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;主线 5 ·【AI 为主，1 条传统】贝叶斯/概率反演：机制库扩到第六、七种，并开始&quot;分布式化&quot;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;机制累积（AI 线）&lt;/strong&gt;：扩散后验采样 → INN → HMC → 神经似然 HMC → SVGD → &lt;strong&gt;B-BiLo（09-22 #3）&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分布式化（传统线）&lt;/strong&gt;：&lt;strong&gt;共识 ADMM + SVGD（09-23 #2）&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-22 #3 B-BiLo&lt;/strong&gt;（10.1038/s41467-026-77768-7）：上层 HMC 采样参数 + 下层 LoRA 近似解算子，&lt;strong&gt;显式宣称&quot;无需合成数据、无需伴随方程&quot;&lt;/strong&gt;，并给出下层近似误差对后验精度的影响分析。⚠️ &lt;strong&gt;但实验只有肿瘤生长等扩散型 PDE，恰恰避开了 PINN Atlas 指出的难点区（双曲型/波动）。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-24 #6 DispSAC&lt;/strong&gt;（EarthArXiv 10.31223/x5mj75）：&lt;strong&gt;策略集成派&lt;/strong&gt;——用 RL 策略的多次初始化离散度描述解的变异性。⚠️ &lt;strong&gt;优势是成本，缺口是它不等于后验&lt;/strong&gt;。&lt;strong&gt;本系列立场：可作稳定性扫描，不应作为 UQ 交付物。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-25 v2 #5 GRADSOLVE&lt;/strong&gt;（arXiv 2609.28458，&lt;strong&gt;代码 github.com/ECLIPSE-AI4Science/gradsolve，MIT，27 stars&lt;/strong&gt;）：JAX + 线程级 ensemble 并行。&lt;strong&gt;可微 HPC 三条路线至此完整成型&lt;/strong&gt;（均为传统/可微线）：PyTorch + 手写核 + 离散伴随（TorchFDTD）；MPI 千核求解器在环（Diff-NekRS）；JAX + 线程级 ensemble 并行（GRADSOLVE）。&lt;strong&gt;共同点：都不是靠通用 AD 直接套在正演上。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;主线 6 ·【AI/地球物理】LLM / Agentic 地球物理：从&quot;闭源宣示&quot;走向&quot;有细节可评&quot;，但仍无与传统方法的定量对比&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;09-17 #1 Agentic FWI&lt;/strong&gt;（跨周）—— 至今&lt;strong&gt;摘要与全文均不可得&lt;/strong&gt;，跨期 ≥ 3 期悬置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-22 #4 VLM 视觉地震学&lt;/strong&gt;（Research Square rs-10830064）：把波形渲染成无损图像喂给 VLM 做 P/S 到时拾取，提出&lt;strong&gt;注视点式（foveated）多阶段缩放&lt;/strong&gt;与&lt;strong&gt;形态学弃权协议&lt;/strong&gt;，并&lt;strong&gt;命名了两个失效模式&lt;/strong&gt;（compliance bias 顺从偏差、text-scalar decoupling 文本-标量解耦）。⚠️ 预印本未审稿，&lt;strong&gt;无与传统拾取器的定量对比&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-23 #4&lt;/strong&gt;（10.1029/2026JH001578）：把台站坐标、P 波到时、峰值地速&lt;strong&gt;直接喂给 TinyLlama + LoRA&lt;/strong&gt; 输出震级/位置/发震时刻，&lt;strong&gt;显式声明&quot;不需要速度模型&quot;&lt;/strong&gt;，并与 &lt;strong&gt;INGV 业务化自动方法对照&lt;/strong&gt;——本系列&lt;strong&gt;第一条带业务系统对照基线&lt;/strong&gt;的 LLM 地震学工作。⚠️ 明确报告&quot;加 S 波收益不足以抵消延迟&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-25 v2&lt;/strong&gt; 另有 LLM Agent + XGBoost 液化评估（完整数据流与量化指标）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;判断&lt;/strong&gt;：&lt;code&gt;Agentic/多模态地球物理&lt;/code&gt; 已从&quot;存在性信号&quot;升级为&quot;有细节可评&quot;，但&lt;strong&gt;仍无任何一条给出与传统方法的定量对比&lt;/strong&gt;。值得注意的是 &lt;strong&gt;TinyLlama + LoRA&lt;/strong&gt; 与 09-19 的 &lt;strong&gt;XiaoNet（240 KB）&lt;/strong&gt; 同属&quot;小模型 + 轻量微调&quot;路线——&lt;strong&gt;这条线比&quot;接一个大 LLM&quot;更可能先落地到台站侧。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;主线 7 ·【传统方法】传统数值方法在本周集中回归&lt;/h3&gt;
&lt;p&gt;09-25 v2 的十席中有&lt;strong&gt;四条是非 AI 的数值方法&lt;/strong&gt;，且都直接服务 FWI/层析的底座：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别细分&lt;/th&gt;
&lt;th&gt;服务对象&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;混合地形相关 eikonal 求解器（10.1190/geo-2025-0302）&lt;/td&gt;
&lt;td&gt;传统（走时计算）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FWI 初始模型 / 层析&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多尺度并行时间步进三维时域电磁模拟（10.1190/geo-2025-0182）&lt;/td&gt;
&lt;td&gt;传统（正演并行）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;正演并行&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;双曲 Radon 域分块自适应阈值 FISTA（10.1007/s11770-026-1616-6）&lt;/td&gt;
&lt;td&gt;传统（信号处理/去噪）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;去噪 baseline&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kalman 后续波至速度-反射界面同时走时反演（10.1007/s11770-026-1547-2）&lt;/td&gt;
&lt;td&gt;传统（反演）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;初值构建&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;另加 09-25 v1 #8（GPR FWI 稳定初始模型构建，10.1007/s11770-026-1617-5，传统）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;与主线 1 形成互补&lt;/strong&gt;：&lt;strong&gt;HPC 侧在解决&quot;算得起&quot;，本轮传统方法在解决&quot;算得准、起得来&quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;主线 8 ·【AI/地球物理·中文团队】中文团队产出密度高，但集中在应用侧且代码基本不公开&lt;/h3&gt;
&lt;p&gt;本周参与的中文单位（据日报摘录）：&lt;strong&gt;SPBench：北大 + 哈工大&lt;/strong&gt;；&lt;strong&gt;HFNO：CNPC + 吉林大学&lt;/strong&gt;；&lt;strong&gt;PINNForge：南开 + 华东师大&lt;/strong&gt;；&lt;strong&gt;GMD 矿产 UQ：地大武汉&lt;/strong&gt;；&lt;strong&gt;3D-DCTU：浙大海洋学院 + CNPC&lt;/strong&gt;；&lt;strong&gt;DFRSeisNet：成都理工大学 + 东方地球物理 BGP&lt;/strong&gt;；&lt;strong&gt;多尺度逐步学习网络：RIPED + BGP（四川盆地 7 口盲井）&lt;/strong&gt;；&lt;strong&gt;神经核函数：中国地质大学（北京）&lt;/strong&gt;；&lt;strong&gt;Applied Geophysics 系列：成都大学 / 西南交大 / 中南大学&lt;/strong&gt;；&lt;strong&gt;eDWI / IFWI：中国海洋大学&lt;/strong&gt;（跨周）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;共同特点&lt;/strong&gt;：&lt;strong&gt;数据实测、指标具体、但代码基本不公开。&lt;/strong&gt; 本周 60 条位中仅 GRADSOLVE（传统/可微）与延伸观察候选 FrFNO 提供了可访问代码链接。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、本周精选 Top 10（AI/地球物理 6 条 + 传统方法 4 条，整体按相关性排序）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;配比说明&lt;/strong&gt;：本周原 Top 15 经新口径归类后，AI/地球物理 11 条、传统方法 4 条。按&quot;AI 6 + 传统 4&quot;配比重排为 Top 10；移出主榜的 5 条（B-BiLo、basin 选择、VLM、Kokkos、TinyLlama↔INGV）进入提名区并标注类别。降级理由：B-BiLo 实验仅覆盖扩散型 PDE（避开了波动方程难点）；VLM 与 TinyLlama 属地震监测应用侧、且无与传统方法的定量对比；Kokkos 与 TorchFDTD/GRADSOLVE 同属&quot;内存/HPC&quot;证据链，保留代表性最强的两条；basin 选择为观点性论据（Allen-Cahn 演示），已并入主线 4 表述。&lt;strong&gt;这 5 条的完整信息仍在提名区与主线中，无信息损失。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1. ⭐ 从空闲到紧急：面向高保真地震估计的资源采集式 HPC 工作流&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（HPC 系统/工作流；NN 反演为工作流组件，核心创新在算力时间复用架构）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：机构为二手信源交叉确认（⚠️）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.22814 · https://arxiv.org/abs/2609.22814 ·〔09-22 #1〕·已被第八届 &lt;strong&gt;Interactive and Urgent HPC&lt;/strong&gt; 研讨会接收&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：两个专用 kernel + &lt;strong&gt;资源采集（resource harvesting）&lt;/strong&gt; + 紧急切换机制——把平时空闲算力用于构建 NN 训练集，震时切换为&quot;NN 反演 + 物理模拟 + 动态加密&quot;的应急模式。这是&lt;strong&gt;算力时间复用的完整系统架构&lt;/strong&gt;，不只是加速技巧。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据/规模&lt;/strong&gt;：震后高保真成像场景（⚠️ 硬件规模未披露）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化&lt;/strong&gt;：能耗 &lt;strong&gt;−76%&lt;/strong&gt;；吞吐 &lt;strong&gt;3.7×&lt;/strong&gt;；应急成本 &lt;strong&gt;−97.9%&lt;/strong&gt;；震后 &lt;strong&gt;30 分钟&lt;/strong&gt;出图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;本系列自 09-15 以来第一条&quot;真 HPC&quot;条目&lt;/strong&gt;，同时命中&quot;面向地震 + HPC 系统层方法学 + 完整量化账&quot;三要件。若项目内有&lt;strong&gt;震后快速成像/应急响应&lt;/strong&gt;场景，这是可直接对标的工作流架构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ &lt;strong&gt;全部数字为摘要自述&lt;/strong&gt;；两个 kernel 的设计未展开；&lt;strong&gt;30 分钟对应的硬件规模未披露&lt;/strong&gt;；&lt;strong&gt;必须读全文后再引用任何数字。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. ⭐ SPBench：面向勘探地震处理的多任务评测基准&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（ML 方法评测基准）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：北京大学 + 哈尔滨工业大学（据日报摘录）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.28925（v1，提交 2026-09-24）· https://arxiv.org/abs/2609.28925 ·〔09-25 #1〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法/结论&lt;/strong&gt;：审计 &lt;strong&gt;368 篇论文，发现仅 25 篇公开代码&lt;/strong&gt;；给出**&quot;合成数据上的排名不能可靠预测实测数据上的排名&quot;**的实测结论。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：多任务勘探地震处理基准（详见论文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可复现性&lt;/strong&gt;：⚠️ &lt;strong&gt;项目页 404&lt;/strong&gt;。地址 &lt;code&gt;https://seismicprocessingbenchmark.github.io/SPBench/&lt;/code&gt; &lt;strong&gt;由论文 HTML 全文图注确证（可信）&lt;/strong&gt;，但页面尚未上线；arXiv 摘要页与 HTML 全文&lt;strong&gt;均无仓库地址&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周&lt;strong&gt;动摇了&quot;在合成数据上刷点即代表方法更好&quot;这一默认前提&lt;/strong&gt;。与 W41 期的 GeoFWI3D 互补：&lt;strong&gt;SPBench 说&quot;评测不规范&quot;，GeoFWI3D 提供&quot;可以用来规范评测的东西&quot;。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ arXiv 元数据与图注核验；⚠️ &lt;strong&gt;项目页 404，需人工每周复查&lt;/strong&gt;——这是所有基于 SPBench 的行动建议能否落地的前提。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. ⭐ 由浅到深的扩散式速度模型建立（Part I 方法 + Part II 真实场景）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（扩散生成模型；深度渐进生成顺序）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ KAUST 为单位推断&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.26454 / 2609.26482（提交 2026-09-22）· https://arxiv.org/abs/2609.26454 ／ https://arxiv.org/abs/2609.26482 ·〔09-23 #1〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：&lt;strong&gt;深度渐进（depth-progressive）生成式 VMB&lt;/strong&gt;——显式利用&quot;深部信息依赖浅部&quot;这一地表观测的固有因果结构，把&lt;strong&gt;层剥离（layer stripping）思想嵌入扩散模型的生成顺序&lt;/strong&gt;；直接替代&quot;速度模型建立&quot;这道工序，而非作为正则化或采样器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：Part II 用&quot;&lt;strong&gt;迁移派生属性 + 层析背景 + 稀疏井&lt;/strong&gt;&quot;这套真实可得的条件组合，在&lt;strong&gt;实测数据&lt;/strong&gt;上闭环；自陈&quot;合成数据训练 → 实测泛化，合成响应与实际观测高度吻合&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未验证（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;本系列首次拿到&quot;扩散先验在实测 VMB 上不崩&quot;的可引用证据。&lt;/strong&gt; 若结论成立，这是该方向最接近可落地的一次。建议作为&lt;strong&gt;该簇的首选复现目标&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ 机构、DOI、代码、数据集明细、同行评议状态&lt;strong&gt;均未验证&lt;/strong&gt;；性能结论&lt;strong&gt;仅为定性自述&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. ⭐ HFNO：高低频协同傅里叶神经算子用于三维声波场正演&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（神经算子正演代理）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：Pengyuan Sun（CNPC）、Puyi Hou（吉林大学）、Ye Lin（吉林大学）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;Journal of Applied Geophysics&lt;/em&gt; · https://doi.org/10.1016/j.jappgeo.2026.106528 ·〔09-24 #2 → 09-25 #2 升级〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：标准 FNO 在谱处理中截断高频模式 → 增设&lt;strong&gt;专用高频 Fourier 分支&lt;/strong&gt;做显式频段选择以覆盖低频分支丢弃的谱区，形成双路互补；另提出&lt;strong&gt;时权因果损失&lt;/strong&gt;把声波传播的因果性嵌入训练目标。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：三个地质复杂度递增的基准，最难一档为 &lt;strong&gt;SEG-Combined（SEG/EAGE Salt + Overthrust 拼合）&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化&lt;/strong&gt;：&lt;strong&gt;HER（高频能量比误差）全部最低&lt;/strong&gt;；相对标准 FNO 基线&lt;strong&gt;最多降低 HER 误差 33%&lt;/strong&gt;；&lt;strong&gt;CPU 单次正演 1.34 s、相对同硬件 Devito 有限差分 3× 加速&lt;/strong&gt;；&lt;strong&gt;GPU 0.0094 s/次&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;本系列 11 期以来唯一同时满足「神经算子 + 三维地震正演 + 中文单位 + 有量化加速比」的条目&lt;/strong&gt;，可直接作为&quot;神经算子做正演代理&quot;的立项与验收参照。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ DOI/作者/机构/&lt;strong&gt;日期三方交叉&lt;/strong&gt;（OpenAlex &lt;code&gt;publication_date&lt;/code&gt; 2026-09-18；Crossref &lt;code&gt;created&lt;/code&gt; 2026-09-18；Crossref &lt;code&gt;published&lt;/code&gt; &lt;strong&gt;2026-12&lt;/strong&gt; 为卷期归属月）；✅ 摘要经 OpenAlex DOI 直查取得；⚠️ 代码未声明。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 分布式近端 Stein 变分梯度下降（SVGD）做大规模走时层析贝叶斯推断&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（贝叶斯数值反演 + 分布式并行；SVGD 无神经网络）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ 机构（德黑兰大学 / Georgia Tech）为&lt;strong&gt;推断&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.26653（提交 2026-09-22 16:20:25 UTC）· https://arxiv.org/abs/2609.26653 ·〔09-23 #2〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：把全局走时层析重铸为&lt;strong&gt;共识型 ADMM&lt;/strong&gt;，SVGD 放进 ADMM worker 内部，用 &lt;strong&gt;Woodbury 恒等式&lt;/strong&gt;导出数据空间 Gauss-Newton 更新；明确以&quot;&lt;strong&gt;消除大规模敏感矩阵、降低 3D 内存占用&lt;/strong&gt;&quot;为目标。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：大规模走时层析（具体数据集未验证）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;同时命中 HPC 与贝叶斯两条主线&lt;/strong&gt;。它与 09-22 #1 合起来第一次勾出&quot;&lt;strong&gt;地震反演的 HPC 化&lt;/strong&gt;&quot;的两个层次：算力时间复用（系统层）与算法并行化（算法层）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ 机构、代码、数据集、&quot;降低内存占用&quot;的&lt;strong&gt;量化倍数&lt;/strong&gt;全部未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. TorchFDTD：带离散伴随与主机流式执行的 GPU 加速 FDTD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（数值/HPC；无学习组件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：arXiv 著录（光子学 FDTD，&lt;strong&gt;非地震，迁移需自行验证&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.30039（提交 2026-09-24 16:07:07 UTC；physics.optics + physics.comp-ph；26 页 13 图）· https://arxiv.org/abs/2609.30039 ·〔09-25 #3〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：把全局状态与 checkpoint &lt;strong&gt;换出到主机内存&lt;/strong&gt;，用时间换显存；&lt;strong&gt;手工实现精确离散伴随&lt;/strong&gt;而非让 AD 穿透核函数，用&quot;与中心差分相差 0.78%&quot;验证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化&lt;/strong&gt;：&lt;strong&gt;2.7–3.1× 时间换 56%–65% 峰值显存下降&lt;/strong&gt;，且&lt;strong&gt;离散化格式不变&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周&quot;显存第三条路径&quot;中&lt;strong&gt;工程上最可直接抄的一条&lt;/strong&gt;——不改格式、不改数值方法，纯粹做状态流式化。若项目正受 3D FD 显存限制，这条优先级最高。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ arXiv 元数据核验；⚠️ 领域为光子学 FDTD。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7. MENO：显存高效神经算子&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（神经算子架构）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ 机构未验证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.27739（提交 2026-09-23 11:54:03 UTC）· https://arxiv.org/abs/2609.27739 ·〔09-24 #1〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：主张&lt;strong&gt;显存占用与数据分辨率解耦&lt;/strong&gt;；面向&quot;观测空间 ≠ 模型空间&quot;的跨几何算子学习。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：算子学习基准（清单未验证）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化&lt;/strong&gt;：⚠️ 参数 &lt;strong&gt;−84.4% / FLOPs −69.2%&lt;/strong&gt;（自述，机构未验证）；&quot;significantly smaller&quot;&quot;best accuracy&quot; 均无第三方复核。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：仓库内容未审阅（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周&quot;内存而非 FLOPs&quot;信号的第一条贡献者，且&lt;strong&gt;首次出现&quot;分辨率无关显存&quot;这一维度的主张&lt;/strong&gt;。对&quot;由地面观测推地下模型&quot;这类&lt;strong&gt;观测空间 ≠ 模型空间&lt;/strong&gt;的问题有直接适配性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ 机构、基准清单、全部性能数字未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8. 泄漏感知的全剖面评估与标签高效半监督地震相分割&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（半监督分割 + 评测方法论）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：&lt;em&gt;Frontiers in Earth Science&lt;/em&gt; 著录（日报未展开具体名单）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：https://doi.org/10.3389/feart.2026.1910345（CC BY 4.0）·〔09-25 v2 #2〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法/结论&lt;/strong&gt;：用 &lt;strong&gt;F3 / Parihaka 两个公开数据集&lt;/strong&gt;证明**&quot;架构差异小于随机种子差异&quot;&lt;strong&gt;，并把数据泄漏来源&lt;/strong&gt;精确定位到&quot;重叠 patch 的随机切分&quot;**。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：F3、Parihaka（公开）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;本周最有分量的方法论信号之一&lt;/strong&gt;，与 SPBench 独立得出一致且可执行的行动结论：&lt;strong&gt;先修评测协议（整剖面切分 + buffer gap + 多种子），再谈架构创新。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 期刊/DOI/CC BY 核验；⚠️ 具体数值需读全文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9. GRADSOLVE：在 GPU 上求解并微分 ODE 集合（可微 HPC 第三条路线）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（可微 HPC；JAX AD 为计算工具，无学习组件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ HTML 抓取仅得 University of London / Oxford 片段，&lt;strong&gt;作者机构未确证&lt;/strong&gt;；领域为天体物理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.28458 · https://arxiv.org/abs/2609.28458 · &lt;strong&gt;代码 https://github.com/ECLIPSE-AI4Science/gradsolve（MIT，27 stars，创建 2026-09-02，末次推送 2026-09-03）&lt;/strong&gt; ·〔09-25 v2 #5〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：JAX + &lt;strong&gt;线程级 ensemble 并行&lt;/strong&gt;，实现大规模 ODE 集合的求解与微分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：天体物理 ODE 集合（&lt;strong&gt;迁移需自行验证&lt;/strong&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：✅ 仓库链接与许可核验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;可微 HPC 三条路线至此完整成型&lt;/strong&gt;（离散伴随 / 求解器在环 / JAX ensemble），且&lt;strong&gt;本周唯一附带真实可访问代码&lt;/strong&gt;的条目。适合作为&quot;JAX 生态做地震正反演&quot;的技术验证起点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 仓库链接与许可核验；⚠️ 作者机构未确证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10. 成本—精度权衡：神经算子 vs 经典数值求解器&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（神经算子适用边界的系统性研究）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ 机构（Caltech）为&lt;strong&gt;推断&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.24021（提交 2026-09-21 02:45:25 UTC）· https://arxiv.org/abs/2609.24021 ·〔09-23 #3〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法/结论&lt;/strong&gt;：在&lt;strong&gt;刻意对神经算子有利的设定下&lt;/strong&gt;（训练成本完全摊销），&lt;strong&gt;仍存在经典求解器胜出的区间&lt;/strong&gt;；给出成本—精度帕累托前沿与&lt;strong&gt;失效边界&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：算子学习基准 suite（具体算例未验证）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未验证（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;&quot;什么时候不该用神经算子&quot;的答案。&lt;/strong&gt; 与 PINN Atlas（高频 Helmholtz 差 2–3 个量级）构成同一条&quot;不要盲目替代经典求解器&quot;的证据链，但本条更系统、更可执行。&lt;strong&gt;用于做 surrogate 立项排序。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ 机构、代码、具体算例与图表数值未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;本周提名区（第 11–25 位，供追踪，不展开；标注类别）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;来源&lt;/th&gt;
&lt;th&gt;首次收录&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;B-BiLo：带低秩适配的贝叶斯双层算子学习（&lt;strong&gt;免伴随路线&lt;/strong&gt;；⚠️ 实验仅扩散型 PDE）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1038/s41467-026-77768-7&lt;/td&gt;
&lt;td&gt;09-22 #3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Learning Physics from an Imperfect Ancestor（&lt;strong&gt;surrogate 的价值在 basin 选择而非精度&lt;/strong&gt;；与 FWI cycle skipping 同构）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2609.24947&lt;/td&gt;
&lt;td&gt;09-24 #3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;多模态大模型视觉地震学（VLM 做 P/S 拾取；命名两个失效模式；&lt;strong&gt;无与传统拾取器定量对比&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.21203/rs.3.rs-10830064/v1&lt;/td&gt;
&lt;td&gt;09-22 #4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;基于 Kokkos 的低阶 GPU 加速有限元核函数性能分析（&lt;strong&gt;性能由访存映射决定，而非算术强度&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;传统（HPC）&lt;/td&gt;
&lt;td&gt;arXiv 2609.21681&lt;/td&gt;
&lt;td&gt;09-24 #4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;适配预训练 LLM 快速反演震级与位置（TinyLlama+LoRA，&lt;strong&gt;与 INGV 业务系统对照&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1029/2026JH001578&lt;/td&gt;
&lt;td&gt;09-23 #4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;方向感知掩码预训练 3D 地震表征学习 → 跨工区波阻抗反演（&lt;strong&gt;实证&quot;重建保真度 ≠ 可迁移性&quot;&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2609.24615&lt;/td&gt;
&lt;td&gt;09-23 #5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;PosteriorBench：生成式反演器的后验匹配评测（参考后验 + 5 项指标 + 开源代码）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2609.20794&lt;/td&gt;
&lt;td&gt;09-21 #4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;地震波形去噪跨时间域/时频域/混合域系统评测（&lt;strong&gt;以下游任务为指标&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1029/2026JH001403&lt;/td&gt;
&lt;td&gt;09-21 #5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;ActSeisDAS：连续主动源 DAS 监测的边侧 Python 框架（&lt;strong&gt;99.9% 数据缩减，324 GB/天 → 16 MB，24 小时数据 46 分钟&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1016/j.acags.2026.100410&lt;/td&gt;
&lt;td&gt;09-21 #9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;CASCU：混合注意力网络做自适应地震绕射波分离&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.3389/feart.2026.1898241&lt;/td&gt;
&lt;td&gt;09-25 v2 #1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;Diff-NekRS：多时间步&quot;求解器在环&quot;训练的可微框架（Argonne，1020 MPI ranks）&lt;/td&gt;
&lt;td&gt;传统（可微 HPC）&lt;/td&gt;
&lt;td&gt;arXiv 2609.23208&lt;/td&gt;
&lt;td&gt;09-25 #4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Beyond Compression：神经代理求解器长时程 rollout 的潜表示训练（&lt;strong&gt;FLOPs −2 个量级、显存减半&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2609.30198&lt;/td&gt;
&lt;td&gt;09-25 #5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;任意发射波形三维时域电磁多尺度并行时间步进&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;10.1190/geo-2025-0182&lt;/td&gt;
&lt;td&gt;09-25 v2 #6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;RSDB：Raspberry Shake 全球地震波形数据集（面向 ML）&lt;/td&gt;
&lt;td&gt;AI（数据集）&lt;/td&gt;
&lt;td&gt;10.1016/j.eqs.2026.06.001&lt;/td&gt;
&lt;td&gt;09-25 v2 #10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;3D-DCTU（真 3D 网络，SEG &lt;em&gt;Geophysics&lt;/em&gt;）vs DFRSeisNet（分块 + 全局-局部分解，&lt;em&gt;Sensors&lt;/em&gt;）——&lt;strong&gt;同一问题的两种相反处方&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1190/geo-2024-0855 ／ 10.3390/s26185938&lt;/td&gt;
&lt;td&gt;09-24 #5 / #8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;四、本周全量条目索引（60 条位，按日报原序；含类别列）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;类别标注为本文件按&quot;分类口径&quot;对日报内容的重新归类，&lt;strong&gt;不改变日报原文&lt;/strong&gt;。&quot;（AI 辅助）&quot;= AI 仅作辅助环节；&quot;（可微）&quot;= ML 框架仅作求导工具、无学习组件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2026-09-21（窗口 09-14 ~ 09-21）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Structure-Driven Inversion（SDI）⚠️ &lt;strong&gt;跨期重复（首收 09-16 #1）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;传统（范式）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.16536&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Physics-guided FCN using attenuation information for viscoacoustic VMB&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.21203/rs.3.rs-10933226/v1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Efficient matrix-free Gauss-Newton traveltime tomography on full-metric deformed grids&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.14982&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;PosteriorBench: From Point Estimates to Posterior Matching&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.20794&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Earthquake Seismogram Denoising Across Time, Time-Frequency, and Hybrid Domains&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2026JH001403&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;DAS-SPP: Transformer-based seismic phase picking on DAS data&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1016/j.cageo.2026.106264&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Linearized PINN with pretrained nonlinear layers&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.14926&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Physics-Guided Conditional Flow Matching with Energy Regularization&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.15536&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;ActSeisDAS: Python-based edge framework for continuous active seismic DAS monitoring&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1016/j.acags.2026.100410&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Adaptive and accuracy-aware multiple data assimilation（ES-MDA-A2）⚠️ &lt;strong&gt;跨期重复（首收 09-16 #6）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.16434&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-22（窗口 09-15 ~ 09-22；arxiv geo-ph 主窗口仅 16 条）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;⭐ From Idle to Urgent: A Resource-Harvested HPC Workflow for High-Fidelity Seismic Estimation&lt;/td&gt;
&lt;td&gt;传统（HPC 系统）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.22814&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Inversion of Elastic Properties of Stratified Layered Media using EDWI&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2025-0147&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Bayesian bilevel operator learning with low-rank adaptation（B-BiLo）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1038/s41467-026-77768-7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Do AI dream of P and S picks? Multimodal LLMs applied to visual seismological analysis&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.21203/rs.3.rs-10830064/v1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Reinforcement Learning-based Task Aware Denoising for DAS Seismic Data（RL-TAD）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2024-0704&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Can Deep Learning Achieve Cross-Physics Mapping?（CPM）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.16853&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;HiLNO: Hierarchical Latent Neural Operator with Multi-Scale Supervision&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.18419&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;AI-Driven Scientific Computing Workflows: A Systems Review&lt;/td&gt;
&lt;td&gt;AI（综述）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.21162&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;FaultNet: Inferring Complex Fault Structures from Earthquake Hypocenter Distributions&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.5281/zenodo.22837108&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;PDEs in the age of machine learning: a critical synthesis&lt;/td&gt;
&lt;td&gt;AI（综述）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s10462-026-11677-5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-23（窗口 09-16 ~ 09-23）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;⭐ Shallow-to-deep velocity model building via diffusion models — Part I / Part II&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.26454 ／ https://arxiv.org/abs/2609.26482&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Distributed Proximal SVGD for Large-scale Bayesian Inference in Traveltime Tomography&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.26653&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Cost-Accuracy Trade-offs: Neural Operator vs Classical Numerical Solver&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.24021&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Adapting a Pretrained LLM to Rapidly Recover Earthquake Magnitude and Location&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2026JH001578&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Direction-Aware Masked Pretraining for 3D Seismic Representation Learning&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.24615&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Predicting OOD Generalization of Neural Operators via Spectral Error Decomposition&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.23529&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Multiscale Stepwise Learning Network for Seismic Impedance Inversion&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.3390/app16189358&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Spatio-Temporal Neural Kernel Function Model for Earthquake Clustering（ETAS ↔ 神经点过程）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2025JH001110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Detection of the 2019 Hikurangi slow event using a transformer DL model&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.13168/agg.2026.0027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;StrainProx: Seismic Time-Strain Inversion with Proximal Solvers&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/tle-2026-1107&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-24（窗口 09-17 ~ 09-24）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;MENO: Memory-Efficient Neural Operator&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.27739&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;⭐ High-low frequency collaborative FNO for 3D acoustic seismic wavefield modeling（HFNO）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1016/j.jappgeo.2026.106528&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Learning Physics from an Imperfect Ancestor&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.24947&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Performance Analysis of Low-Order, GPU-accelerated FE Kernels using Kokkos&lt;/td&gt;
&lt;td&gt;传统（HPC）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.21681&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;A hybrid CNN-Transformer network for linear noise suppression in 3D seismic data（3D-DCTU）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2024-0855&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;DispSAC: Surface-wave dispersion inversion using soft actor-critic RL&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.31223/x5mj75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;GenVoid: Uncertainty-Aware Learning of Subsurface Material Defects&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.23761&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;DFRSeisNet: Fluctuation-Prior-Regularized Background Noise Attenuation&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.3390/s26185938&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Beyond PINNs: Unified Gauss-Newton and Petrov-Galerkin Framework&lt;/td&gt;
&lt;td&gt;传统（数值）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.20641&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Mechanism-oriented tendency-integration operator networks for PDE foundation models&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.21203/rs.3.rs-10822726/v1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-25 v1（窗口 09-18 ~ 09-25）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;⭐ SPBench: A Multi-Task Evaluation Benchmark for Exploration Seismic Processing&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.28925&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;HFNO 三维声波场正演 ⚠️ &lt;strong&gt;跨期重复 + 升级（首收 09-24 #2，本期取得完整摘要）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1016/j.jappgeo.2026.106528&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;TorchFDTD: GPU-accelerated FDTD with discrete adjoints and host-streamed execution&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.30039&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Diff-NekRS: Scalable Differentiable Framework for Multi-Timestep Solver-in-the-Loop Training&lt;/td&gt;
&lt;td&gt;传统（可微）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.23208&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Beyond Compression: Latent Representations for Stable Long-Horizon Rollout in Neural Surrogate Solvers&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.30198&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Conformal Structure of the Brinkman Penalisation Method for Operator Learning of Hamiltonian PDEs&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.29847&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Learning Operators of Geometry with an Interface Autoencoder&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.29437&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Stable Initial Model Construction for 2D Single-Parameter GPR FWI&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s11770-026-1617-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Automated Workflow for Focal Mechanism Determination of Low-Magnitude Earthquakes（SE Alps）&lt;/td&gt;
&lt;td&gt;传统（自动化流程）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1785/0220260124&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Parameter estimation for land-surface models using Neural Physics&lt;/td&gt;
&lt;td&gt;传统（可微，免伴随；前向完全基于物理、不做任何训练）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.5194/gmd-19-8801-2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-25 v2（第二轮检索增补，15:05）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Adaptive seismic diffraction separation via hybrid attention-based CASCU network&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.3389/feart.2026.1898241&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;⭐ Leakage-aware full-section evaluation and label-efficient semi-supervised seismic facies segmentation&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.3389/feart.2026.1910345&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Hybrid topography-dependent eikonal solver for acoustic tilted orthorhombic anisotropy&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2025-0302&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Stratigraphy-guided joint inversion of acoustic impedance and resistivity（碳酸盐岩储层）&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.3389/feart.2026.1900017&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;⭐ GRADSOLVE: Differentiable astrophysics at scale（&lt;strong&gt;代码 github.com/ECLIPSE-AI4Science/gradsolve，MIT&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;传统（可微）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.28458&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Multiscale parallel time-stepping for 3D time-domain electromagnetic data&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2025-0182&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Gravity Inversion Based on Vision Transformer（鄱阳湖盆地）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s11770-026-1608-6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Block adaptive thresholding FISTA for random noise suppression in hyperbolic Radon domain&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s11770-026-1616-6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Kalman-Based Simultaneous Traveltime Inversion for Velocity and Reflector Geometry&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s11770-026-1547-2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;RSDB — A global seismic waveform dataset from the Raspberry Shake network&lt;/td&gt;
&lt;td&gt;AI（数据集）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1016/j.eqs.2026.06.001&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;五、本周演化：重复 / 升级 / 新增方向（分两线）&lt;/h2&gt;
&lt;h3&gt;5.A AI/地球物理线&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;周内重复（主榜内的跨期重复命中）&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;首次收录&lt;/th&gt;
&lt;th&gt;本期状态&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HFNO（10.1016/j.jappgeo.2026.106528）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-24 #2&lt;/td&gt;
&lt;td&gt;09-25 #2 再入榜，&lt;strong&gt;并取得完整摘要与量化结果&lt;/strong&gt;（见 5.A 升级表）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;升级（前日&quot;信号&quot;→ 拿到可核验证据）&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;升级项&lt;/th&gt;
&lt;th&gt;轨迹&lt;/th&gt;
&lt;th&gt;结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⭐ &lt;strong&gt;HFNO 三维声波场正演&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-23 期&quot;按标题检索无命中、字段全缺&quot;→ 09-24 期经 OpenAlex + Crossref DOI 反查拿到 DOI/作者/机构（仍无摘要）→ 09-25 期经 &lt;strong&gt;OpenAlex DOI 直查&lt;/strong&gt;取得完整摘要&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;拿到方法 + 数据 + 量化加速比&lt;/strong&gt;（HER 最多降 33%；CPU 1.34 s、相对 Devito 3×；GPU 0.0094 s/次）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XiaoNet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-19 摘要未获取 → 09-22 经 OpenAlex 取到完整摘要（&amp;gt;93% 压缩 / 240 KB / 亚毫秒）&lt;/td&gt;
&lt;td&gt;✅ 数字可用；⚠️ &lt;strong&gt;同时暴露 OpenAlex 机构映射错误&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;神经算子清算线&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-21 #4 PosteriorBench（后验对不对）→ 09-22 #10 PINN Atlas（高频 Helmholtz 差 2–3 量级）→ 09-23 #3 成本—精度边界、#6 OOD 谱诊断&lt;/td&gt;
&lt;td&gt;✅ 形成 3 条独立、可引用的支撑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agentic/多模态地球物理&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-17 #1 Agentic FWI（摘要不可得）→ 09-22 #4 VLM 地震学（命名失效模式）→ 09-23 #4 TinyLlama ↔ INGV 业务对照&lt;/td&gt;
&lt;td&gt;✅ 从&quot;存在性信号&quot;升级为&quot;有细节可评&quot;；❌ &lt;strong&gt;仍无与传统方法的定量对比&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PINN 定位&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-20 PINN Atlas 量化清算 → 09-21 #7 lPINN 给出对应工程解法（离线学基、在线只解最后一层，在线推理快 1–3 个数量级）&lt;/td&gt;
&lt;td&gt;✅ 批评与补救在同一周期配对&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;本周新增方向&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🆕 视觉语言模型（VLM）做地震学判读（注视点式多阶段缩放 + 形态学弃权协议 + 两个被命名的失效模式）&lt;/li&gt;
&lt;li&gt;🆕 跨物理域映射（Cross-Physics Mapping）：同一潜流形上学习扩散场 ↔ 波场双向算子，并&lt;strong&gt;量化出方向不对称性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;🆕 强化学习做&quot;逐区域去噪策略选择&quot;（A3C 智能体按数据区域挑选轻量去噪网络）&lt;/li&gt;
&lt;li&gt;🆕 双层算子学习 + LoRA 的免伴随贝叶斯反演（权重空间采样 → 参数空间采样）&lt;/li&gt;
&lt;li&gt;🆕 深度渐进（depth-progressive）生成式 VMB（层剥离思想嵌入扩散生成顺序）&lt;/li&gt;
&lt;li&gt;🆕 神经算子的成本—精度帕累托前沿与失效边界&lt;/li&gt;
&lt;li&gt;🆕 神经算子的可审计 OOD 诊断（无需真值；误差谱分解）&lt;/li&gt;
&lt;li&gt;🆕 方向感知的三维地震自监督预训练（&quot;重建保真度 ≠ 可迁移性&quot;反例）&lt;/li&gt;
&lt;li&gt;🆕 神经核函数替代 ETAS 经验核（保留 Hawkes 点过程概率结构）&lt;/li&gt;
&lt;li&gt;🆕 &quot;神经算子的价值在 basin 选择而非精度&quot;&lt;/li&gt;
&lt;li&gt;🆕 分辨率无关的神经算子显存 / 跨几何（cross-geometry）算子学习&lt;/li&gt;
&lt;li&gt;🆕 反问题的&quot;可观测性度量&quot;（面向采集设计）&lt;/li&gt;
&lt;li&gt;🆕 PDE 基础模型的&quot;机制可干预性&quot;&lt;/li&gt;
&lt;li&gt;🆕 地震处理领域系统性&quot;可复现性证据&quot;（368 篇审计；合成排名 ≠ 实测排名）&lt;/li&gt;
&lt;li&gt;🆕 潜空间代理&quot;长时程稳定性&quot;是训练目标问题而非结构问题（反直觉：改善 rollout 稳定性会让常规指标变差）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.B 传统方法线&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;周内重复&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;首次收录&lt;/th&gt;
&lt;th&gt;本期状态&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ES-MDA-A2（2609.16434）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-16 #6（W38）&lt;/td&gt;
&lt;td&gt;09-21 再次排入 #10，无更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDI（2609.16536）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-16 #1（W38）&lt;/td&gt;
&lt;td&gt;09-21 再次排入 #1，但&lt;strong&gt;无新版本、无代码、无实验&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;升级&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;升级项&lt;/th&gt;
&lt;th&gt;轨迹&lt;/th&gt;
&lt;th&gt;结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⭐ &lt;strong&gt;HPC 缺口终结&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-17~09-21 连续 5 期记录&quot;HPC 无系统/方法学产出&quot;→ 09-22 #1 一次性补齐&quot;面向地震 + 系统层方法学 + 完整量化账&quot;三要件&lt;/td&gt;
&lt;td&gt;✅ 缺口终结的是&quot;&lt;strong&gt;方法学供给&lt;/strong&gt;&quot;，不是&quot;工具链更新&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;矩阵自由 GN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-19 #5 CSEM（W38）→ 09-21 #3 全度量形变网格上的初至走时层析（图凝聚 + 块三角分解复用 Krylov 输运算子）&lt;/td&gt;
&lt;td&gt;✅ 从单一应用扩展到走时层析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;可微 HPC 路线图成型&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-25 #3 TorchFDTD（离散伴随）+ #4 Diff-NekRS（求解器在环）+ v2 #5 GRADSOLVE（JAX ensemble，&lt;strong&gt;本周唯一可访问代码&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;✅ 三条路线&lt;strong&gt;全部为传统/可微线&lt;/strong&gt;，共同点&quot;不靠通用 AD 直接套正演&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;本周新增方向&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🆕 Urgent Interactive HPC / 资源采集（完整的&lt;strong&gt;算力时间复用架构&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;🆕 共识 ADMM + 粒子变分推断的分布式贝叶斯反演（去中心化子问题 + worker 内 SVGD）&lt;/li&gt;
&lt;li&gt;🆕 &quot;融合 CUDA 核 + AD 不兼容&quot;被点名，离散伴随成为显式替代（两条独立来源，均给出精度与规模实测）&lt;/li&gt;
&lt;li&gt;🆕 免伴随（adjoint-free）可微反演（Neural Physics：ML 框架 AD 替掉伴随推导，&lt;strong&gt;前向模型完全基于物理、不做任何训练&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;🆕 &lt;strong&gt;传统数值方法集中回归&lt;/strong&gt;：混合地形 eikonal 各向异性求解器、任意波形三维时域电磁多尺度并行、双曲 Radon-FISTA 分块阈值、Kalman 走时-反射界面同时反演、GPR FWI 稳定初始模型&lt;/li&gt;
&lt;li&gt;🆕 变几何算子学习获得理论误差界（Hausdorff / graph-Hausdorff、拓扑证书）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.C ⚠️ 本周暴露的两类口径问题（务必记住）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;日期口径（对 Elsevier 系期刊）&lt;/strong&gt;：HFNO 的 Crossref &lt;code&gt;published&lt;/code&gt; 记为 &lt;strong&gt;2026-12&lt;/strong&gt;（卷期归属月），而 &lt;code&gt;created&lt;/code&gt; 与 OpenAlex &lt;code&gt;publication_date&lt;/code&gt; 均为 &lt;strong&gt;2026-09-18&lt;/strong&gt;。&lt;strong&gt;只用 &lt;code&gt;published&lt;/code&gt; 会把窗口内的新上线论文误判为窗口外。&lt;/strong&gt; 本周起改为「&lt;code&gt;created&lt;/code&gt; 与 OpenAlex &lt;code&gt;publication_date&lt;/code&gt; 交叉、以较早的实际上线口径为准，并在正文显式列出两个日期」。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;机构映射错误（OpenAlex）&lt;/strong&gt;：XiaoNet 的三位作者单位被 OpenAlex 全部映射为 &quot;Oklahoma Biological Survey&quot;，&lt;strong&gt;与论文内容明显不符&lt;/strong&gt;。&lt;strong&gt;结论：机构字段必须双源交叉，不能单信 OpenAlex。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;六、本周趋势总结（分两线）&lt;/h2&gt;
&lt;h3&gt;6.A AI/地球物理线&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;⭐ &quot;可复现性 / 比较口径&quot;第一次成为当日主线，且带着量化证据&lt;/strong&gt;。SPBench（368 篇仅 25 篇有代码、合成排名 ≠ 实测排名）+ v2 独立佐证（架构差异 &amp;lt; 随机种子差异，泄漏源自重叠 patch 随机切分）。&lt;strong&gt;这质疑的是&quot;我们凭什么认为 A 比 B 好&quot;这一前提。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⭐ &quot;扩散 × FWI&quot;从后验采样推进到工序级替代，并首次给出实测泛化证据&lt;/strong&gt;（09-23 #1 Part II）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;神经算子的边界被三条独立证据界定，并新增&quot;basin 选择&quot;这第二验收口径&lt;/strong&gt;。&lt;strong&gt;用单点误差验收 surrogate 是系统性错误的&lt;/strong&gt;，应改为「多步 rollout 误差」+「梯度一致性检验」。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;成本叙事&quot;从零散证据变成结构化的三条路径&lt;/strong&gt;：&lt;strong&gt;算力时间维度复用&lt;/strong&gt;（闲时建训练集 → 震时推理，AI 与 HPC 系统的混合）、&lt;strong&gt;模型容量维度压缩&lt;/strong&gt;（MENO 参数 −84.4% / FLOPs −69.2%；XiaoNet 240 KB）、&lt;strong&gt;结构维度降维&lt;/strong&gt;（LoRA 把权重空间采样降为参数空间采样）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;让 SciML 可审计&quot;已成独立脉络&lt;/strong&gt;：PosteriorBench、跨物理域映射的方向不对称、无需真值的 OOD 谱诊断、机制干预实验。&lt;strong&gt;四条的共同点是都在问&quot;模型为什么给出这个答案&quot;。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM 在地震学中的角色进一步分化&lt;/strong&gt;（渲染成图再判读 vs 直接吃数值做反演），且&lt;strong&gt;开始出现业务系统对照&lt;/strong&gt;；极小配置（TinyLlama + LoRA / XiaoNet 240 KB）比&quot;接一个大 LLM&quot;更可能先落地到台站侧。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;出现一类需要警惕的&quot;廉价 UQ&quot;&lt;/strong&gt;（RL 策略集成 DispSAC）：&lt;strong&gt;它不等于后验&lt;/strong&gt;，可作稳定性扫描、不应作为 UQ 交付物。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;诚实报告密度维持在较好水平&lt;/strong&gt;：09-23 #4 明确报告&quot;加 S 波收益不足以抵消延迟&quot;；#3 的核心结论之一是&lt;strong&gt;神经算子在有利设定下仍会输&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.B 传统方法线&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;⭐ HPC 议题从&quot;缺信息&quot;变成&quot;有方法学&quot;，再收敛到&quot;内存/显存&quot;&lt;/strong&gt;。三阶段：系统/工作流（09-22）→ 算法并行化（09-23）→ 内存工程（09-24、09-25）。&lt;strong&gt;核心判断：大型 3D 地震计算的约束条件是内存，不是 FLOPs。&lt;/strong&gt;（注意：这一判断的证据链&lt;strong&gt;大部分来自传统方法线&lt;/strong&gt;——TorchFDTD、Kokkos、Diff-NekRS、GRADSOLVE、分布式 SVGD。）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;手写 CUDA 核 → 必须准备转置核（离散伴随）&quot;成为明确工程守则&lt;/strong&gt;；discretize-then-optimize 是措辞层面的关键。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可微 HPC 三条路线成型，且全部不依赖通用 AD&lt;/strong&gt;：对本项目的含义是——&lt;strong&gt;若正演已有手写核，转置核的工程投入应列入计划，而非指望框架自动求导。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;免伴随可微反演形成第二条路径&lt;/strong&gt;（Neural Physics，前向完全基于物理、不做任何训练），与矩阵自由 GN 的数学路径互补。对&quot;已有成熟正演代码但伴随维护成本高&quot;的场景是低风险选项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传统数值方法集中回归&lt;/strong&gt;（eikonal、多尺度并行时间步进、Radon-FISTA、Kalman 走时反演），且都服务 FWI/层析的底座——&lt;strong&gt;与 HPC 主线形成&quot;算得起 / 算得准、起得来&quot;的互补。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⭐ 期刊侧是本周被低估的富矿，且是传统方法的主要来源&lt;/strong&gt;：09-25 v2 十席中 &lt;strong&gt;8 条来自正式期刊&lt;/strong&gt;，其中&lt;strong&gt;传统方法 7 条&lt;/strong&gt;（含 4 条纯数值方法）。&lt;code&gt;issn:&lt;/code&gt; 日期区间扫描在 &lt;em&gt;Applied Geophysics&lt;/em&gt;（1672-7975）上一次就捞出 10 篇，而 &lt;code&gt;cat:&lt;/code&gt; 检索完全覆盖不到。&lt;strong&gt;→ ISSN 区间扫描应放在 arXiv &lt;code&gt;cat:&lt;/code&gt; 检索之前执行。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.C 综合判断&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;本周两线产出比约 39:21（AI:传统），传统方法占比为三周最高&lt;/strong&gt;，主要由两个因素驱动：HPC 缺口终结的增量&lt;strong&gt;大部分落在传统方法线&lt;/strong&gt;（系统/工作流、算法并行化、内存工程），以及期刊侧扫描捞出的传统数值方法集中回归。&lt;strong&gt;AI 线在自我清算（评测口径），传统线在补底座（算得起 + 算得准）——两条线本周给出的是同一个信息的两面：领域正在从&quot;提出方法&quot;转向&quot;把方法做实&quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;七、对项目的行动建议（本周合并版）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;课题口径仍为默认的 &lt;strong&gt;AI + HPC + 地震数据处理 + FWI&lt;/strong&gt;。以下均为建议，&lt;strong&gt;未执行任何操作&lt;/strong&gt;。括号内为所属线别。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;A. 立即可做（低风险、低成本，1–3 天）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;⭐ 修评测协议&lt;/strong&gt;——依据 SPBench + 泄漏感知全剖面评估（均为 AI 线）。具体动作：&lt;strong&gt;整剖面切分（禁止重叠 patch 随机切分）+ buffer gap + 多种子重复&lt;/strong&gt;，并在报告里同时给出随机种子间的方差。&lt;strong&gt;这是本周投入产出比最高的一条。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把&quot;多步 rollout 误差 + 梯度一致性检验&quot;写入 surrogate 验收清单&lt;/strong&gt;——依据 09-25 #4/#5 + 09-24 #3（AI 线）。&lt;strong&gt;停止用单点误差验收 surrogate。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在内部评测规范中新增&quot;可审计性&quot;一节&lt;/strong&gt;——依据 09-21 #4、09-23 #6、09-24 #10（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跑通 GRADSOLVE 环境&lt;/strong&gt;（GitHub，MIT）——本周唯一带可访问代码的可微 HPC 条目（传统/可微线），适合作为 JAX 生态做地震正反演的技术起点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按&quot;内存优先&quot;重估现有 3D 流程&lt;/strong&gt;——依据 09-23 #2、09-24 #1/#4、09-25 #3/#5 的六条独立来源（跨两线）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;B. 需要评估（有收益但需先做可行性判断，1–4 周）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;评估 TorchFDTD 式&quot;状态换出主机内存&quot;能否移植到现有 3D FD 正演&lt;/strong&gt;——&lt;strong&gt;2.7–3.1× 时间换 56%–65% 峰值显存，且离散格式不变&lt;/strong&gt;（传统/HPC 线）。这是本周最&quot;可抄&quot;的显存方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复现 HFNO&lt;/strong&gt;（AI 线）——本系列唯一同时满足&quot;神经算子 + 3D 地震正演 + 中文单位 + 量化加速比&quot;的条目。&lt;strong&gt;验收口径建议直接用 HER + 与 Devito 同硬件对比。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估&quot;手写 CUDA 核 → 必须准备转置核&quot;对现有代码库的影响&lt;/strong&gt;——依据 09-25 #3、#4 的两条独立来源，以及 &lt;strong&gt;discretize-then-optimize&lt;/strong&gt; 这一措辞（传统/HPC 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估把 basin 选择作为 surrogate 第二验收口径&lt;/strong&gt;（AI 线），用 FWI cycle skipping 场景做对照实验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估 B-BiLo 的免伴随路线在波动方程上是否成立&lt;/strong&gt;——&lt;strong&gt;关键判据：它只在扩散型 PDE 上验证过&lt;/strong&gt;（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估 SPBench 项目页是否上线&lt;/strong&gt;——&lt;strong&gt;每周复查一次&lt;/strong&gt;（截至 09-25 仍 404）。&lt;strong&gt;这是所有基于 SPBench 的行动建议能否落地的前提。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;C. 仅记录（暂不投入）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SDI / PSDWII 类&quot;零实验零代码&quot;的范式宣示&lt;/strong&gt;（传统线）——09-21 再次排 #1 但无新证据，维持季度级跟踪。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic FWI（10.1007/s11004-026-10342-5）&lt;/strong&gt;（AI 线）——跨期 ≥3 期摘要不可得，&lt;strong&gt;建议人工判断是否继续投入检索预算&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DispSAC 类&quot;廉价 UQ&quot;&lt;/strong&gt;（AI 线）——可作稳定性扫描，&lt;strong&gt;不应作为 UQ 交付物&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSDB / Applied Geophysics 摘要缺口&lt;/strong&gt;——见第八节，建议合并为一次批量人工动作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;D. HPC 侧的具体提醒&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;开源栈下周复查项&lt;/strong&gt;（本周实测均无新版本）：Devito v4.8.23 / 2026-08-07；SPECFEM3D v4.1.1 / 2024-03-15；SeisSol v1.3.2 / 2025-06-17。&lt;strong&gt;连续多期成立，可考虑把复查频率降为双周。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;补订稳定 HPC 信息源&lt;/strong&gt;：SC / ISC / IPDPS / PPoPP、NVIDIA GTC、SEG/EAGE 年会技术程序、SPECFEM / Devito / SeisSol release notes。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&quot;内存而非 FLOPs&quot;应作为硬约束，而非事后优化项。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检索顺序调整&lt;/strong&gt;：&lt;strong&gt;ISSN 区间扫描应优先于 arXiv &lt;code&gt;cat:&lt;/code&gt; 检索&lt;/strong&gt;（本周 09-25 v2 首次实证；且期刊侧是传统方法条目的主要来源）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;八、未解决项 / 需人工确认&lt;/h2&gt;
&lt;h3&gt;8.1 结构性问题（本周持续）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 模板变量连续第 6–8 期未注入&lt;/strong&gt;：&lt;code&gt;{{date}}&lt;/code&gt; / &lt;code&gt;{{lookback_days}}&lt;/code&gt; / &lt;code&gt;{{history_dir}}&lt;/code&gt; / &lt;code&gt;{{lookback_reports}}&lt;/code&gt; / &lt;code&gt;{{project}}&lt;/code&gt; 全部为原始占位符。&lt;strong&gt;建议修改自动化配置注入实际值。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;project&lt;/code&gt; 未指定&lt;/strong&gt;：所有&quot;对项目的启发&quot;均按默认课题语境撰写。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对比基线&lt;/strong&gt;：&lt;code&gt;lookback_reports = 5&lt;/code&gt;（09-18 ~ 09-22 五份），逐步成型。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;8.2 代码/数据可用性（本周统计）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本周 60 条位中，明确给出可访问代码链接的仅 1 条&lt;/strong&gt;：GRADSOLVE（GitHub，MIT，传统/可微线）。另有延伸观察候选 FrFNO。&lt;/li&gt;
&lt;li&gt;09-25 #1 SPBench 自述将发布数据/实现/配置/评测脚本，但 &lt;strong&gt;arXiv 摘要页与 HTML 全文均无仓库地址，GitHub 检索无同名命中&lt;/strong&gt;；项目页 404。&lt;/li&gt;
&lt;li&gt;⚠️ FaultNet（Zenodo 22837108）&lt;strong&gt;代码许可未添加&lt;/strong&gt;（存档说明明确要求发布前补许可）——&lt;strong&gt;商用/再发布前必须确认许可&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.3 跨期悬置项（截至 2026-09-25）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项&lt;/th&gt;
&lt;th&gt;悬置&lt;/th&gt;
&lt;th&gt;建议动作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SPBench 项目页 404&lt;/strong&gt;（&lt;code&gt;https://seismicprocessingbenchmark.github.io/SPBench/&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;09-25 起&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;每周复查&lt;/strong&gt;；地址由论文图注确证，页面未上线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agentic FWI 摘要&lt;/strong&gt;（10.1007/s11004-026-10342-5）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≥ 3 期&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;全文闭源，&lt;strong&gt;建议人工判断是否继续投入检索预算&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Science China Earth Sciences 生成式 AI 综述摘要&lt;/strong&gt;（10.1007/s11430-025-2038-7）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≥ 3 期&lt;/strong&gt;（09-18 起）&lt;/td&gt;
&lt;td&gt;09-21 已拿到作者/单位/出版日；&lt;strong&gt;仅摘要缺失&lt;/strong&gt; → 人工浏览器打开一次并回填&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;伴随法小震矩释放率摘要&lt;/strong&gt;（Research Square rs-3.rs-10679490/v1）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≥ 3 期&lt;/strong&gt;（09-21 起）&lt;/td&gt;
&lt;td&gt;人工取全文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BicycleGAN 日期冲突&lt;/strong&gt;（10.1016/j.cageo.2026.106272，Crossref 记 2027-01 vs OpenAlex 记 2026-09-17）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≥ 2 期&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;人工确认真实上线日期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10.1007/s11770-026-1617-5&lt;/strong&gt;（GPR FWI 初始模型，传统线）&lt;/td&gt;
&lt;td&gt;09-25 起&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;摘要/方法/数据/代码全部缺失&lt;/strong&gt;；方向高度相关，值得人工取 PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10.1007/s11770-026-1587-7&lt;/strong&gt;（U-Net 三维重力反演，中南大学/东华理工/自然资源部）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;连续三期无摘要&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ 09-25 v2 已建议&lt;strong&gt;停止跟踪&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GRADSOLVE 作者机构未确证&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-25 起&lt;/td&gt;
&lt;td&gt;HTML 抓取仅得 University of London / Oxford 片段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RSDB&lt;/strong&gt;（10.1016/j.eqs.2026.06.001）&lt;/td&gt;
&lt;td&gt;09-25 起&lt;/td&gt;
&lt;td&gt;机构/摘要/数据集地址全缺；&lt;strong&gt;日期口径冲突&lt;/strong&gt;（published [2026,10] vs created 2026-09-23）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4 篇 Springer &lt;em&gt;Applied Geophysics&lt;/em&gt; 条目无摘要&lt;/strong&gt;（…1617-5 / …1608-6 / …1616-6 / …1547-2，均为传统线）&lt;/td&gt;
&lt;td&gt;持续&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Springer 不提供结构化摘要，API 路径已走到尽头&lt;/strong&gt; → 合并为&lt;strong&gt;一次批量取 PDF 动作&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10.1190/geo-2025-0182 日期冲突&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-25 起&lt;/td&gt;
&lt;td&gt;Crossref published 2026-09-20 vs created/OpenAlex 2026-09-02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OUP（academic.oup.com）Cloudflare 拦截&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-20 起&lt;/td&gt;
&lt;td&gt;GJI 多条代码/数据声明只能人工浏览器打开&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Princeton RSE WebGPU/WGSL 求解器&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;跨周（W38 已 6 次未验证）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;建议结案或直接放弃&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;J. Seismic Exploration 元数据错配&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;跨周（持续复核仍存在）&lt;/td&gt;
&lt;td&gt;该刊 Crossref 著录&lt;strong&gt;不可靠&lt;/strong&gt;，自动筛选必须交叉验证出版商页面&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;8.4 需人工确认的性能数字（本周）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;本周给出可直接引用量化数字的条目显著多于上周&lt;/strong&gt;（HFNO 的 HER/33%/1.34 s/3×/0.0094 s；Urgent HPC 的 −76%/3.7×/−97.9%/30 分钟；TorchFDTD 的 2.7–3.1×/56%–65%；ActSeisDAS 的 99.9%/46 分钟；MENO 的 −84.4%/−69.2%），但其中&lt;strong&gt;多数为作者自述、未独立验证&lt;/strong&gt;。&lt;strong&gt;已逐条在日报标注，选型决策请以自复现为准。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;九、检索说明与本文件生成方式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本文件不是检索产物&lt;/strong&gt;。生成过程为：读取 &lt;code&gt;AI每日总结_2026-09-21.md&lt;/code&gt; ~ &lt;code&gt;AI每日总结_2026-09-25.md&lt;/code&gt; 五份原文（09-25 含 v1 与第七节 v2 增补）→ 按 ISO 周归并 → 抽取各期&quot;〇 对比&quot;&quot;趋势总结&quot;&quot;未解决项&quot; → 合并同一条目的升级轨迹 → &lt;strong&gt;按&quot;AI/地球物理 + 传统方法&quot;两分类重新归类并标注&lt;/strong&gt; → 按 AI 6 + 传统 4 配比重排 Top 10 → 输出本文件。&lt;strong&gt;未访问任何外部数据源。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两类条数分布&lt;/strong&gt;：60 条位中 &lt;strong&gt;AI/地球物理 39 条 / 传统方法 21 条&lt;/strong&gt;（每日分布：09-21 为 7:3、09-22 为 8:2、09-23 为 8:2、09-24 为 8:2、09-25 v1 为 5:5、09-25 v2 为 3:7）。精选 Top 10 配比 &lt;strong&gt;6:4&lt;/strong&gt;；传统方法条数充足（21 条 ≥ 4），&lt;strong&gt;无需&quot;凑数&quot;&lt;/strong&gt;。&lt;strong&gt;值得注意的结构性事实：传统方法条目几乎全部来自期刊侧（尤其 09-25 v2 的 ISSN 扫描），而 AI 条目以 arXiv 为主——两类信息的检索渠道本身就在分化。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;历史重复/升级/新增&lt;/strong&gt;：周内重复 3 条（SDI〔传统〕、ES-MDA-A2〔传统〕、HFNO〔AI〕）；升级项分两线列于第五节；新增方向 AI 线 15 项 + 传统线 6 项。与前周（W38）对比的新增方向以 🆕 标注。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分类判定说明（边界条目归类原则）&lt;/strong&gt;：① 资源采集式 HPC 工作流（NN 为组件、核心创新为系统架构）→ 传统（HPC 系统）；② SVGD/ADMM 走时层析（无神经网络）→ 传统；③ TorchFDTD / Diff-NekRS / GRADSOLVE / Neural Physics（无学习或学习非主体）→ 传统（可微/HPC）；④ Beyond PINNs（Gauss-Newton/Petrov-Galerkin 数值框架）→ 传统（数值）。&lt;strong&gt;归类为整理动作，若与原文自述不符，以原文为准。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 2026-10-08 变更&lt;/strong&gt;：按用户要求，本周期 5 份日报已随全部 12 份历史日报移出主目录，现留存于工作区 &lt;code&gt;.回收站_日报_2026-10-08/&lt;/code&gt; 与外部备份 &lt;code&gt;/home/liguolong/geo_scratch/backup_日报_2026-10-08/&lt;/code&gt;（删除前校验一致）。09-25 的 v1 与 v2 在周报中合并为&quot;同一日的两轮检索&quot;；日报原文（两段独立内容）请在上述两处查阅。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;诚实性声明&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;所有链接、作者、机构、日期、数字&lt;strong&gt;均转述自日报原文&lt;/strong&gt;；日报未验证的一律沿用&quot;未验证/需人工确认&quot;标注，本文件未做任何新推断或补齐。&lt;/li&gt;
&lt;li&gt;日报中标为&quot;推断&quot;&quot;自述&quot;&quot;预印本&quot;&quot;二手来源&quot;的内容，在本文件中&lt;strong&gt;保持原标注&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;front matter 说明&lt;/strong&gt;：周报使用 &lt;code&gt;tags&lt;/code&gt; / &lt;code&gt;category&lt;/code&gt; 均为 &lt;code&gt;&quot;AI每周总结&quot;&lt;/code&gt;。若站点分类体系需要与日报保持一致，请把 &lt;code&gt;category&lt;/code&gt; 改为 &lt;code&gt;&quot;AI每日总结&quot;&lt;/code&gt;，其余字段不变。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只读优先&lt;/strong&gt;：本文件生成过程未执行任何写入以外的操作，未提交、未删除、未覆盖任何既有文件。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AI每周总结-地球物理（2026-W38）</title><link>https://tuoyuangui.github.io/website/posts/typora/ai%E6%AF%8F%E6%97%A5%E6%80%BB%E7%BB%93/ai%E6%AF%8F%E5%91%A8%E6%80%BB%E7%BB%93_2026-w38/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/ai%E6%AF%8F%E6%97%A5%E6%80%BB%E7%BB%93/ai%E6%AF%8F%E5%91%A8%E6%80%BB%E7%BB%93_2026-w38/</guid><pubDate>Sun, 20 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AI每周总结 · 地球物理（2026-W38：2026-09-14 ~ 2026-09-20）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;📌 分类口径&lt;/strong&gt;：&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI/地球物理&lt;/strong&gt; = 以深度学习、机器学习、神经网络、基础模型、生成模型、强化学习等为核心创新；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传统方法&lt;/strong&gt; = 以物理/数学/数值/信号处理/反演/成像/层析/地震干涉/走时/振幅等为核心，不以 DL/ML 为主要创新（AI 仅作辅助、对比或后处理，或 ML 框架仅作计算工具）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;一、本周概览&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;覆盖区间&lt;/td&gt;
&lt;td&gt;2026-09-14 ~ 2026-09-20（2026-W38）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日报份数&lt;/td&gt;
&lt;td&gt;6（09-15 ~ 09-20）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主榜单条位&lt;/td&gt;
&lt;td&gt;60 条位&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;去重后独立条目&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;约 41 条&lt;/strong&gt;（其余为跨日重复命中）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;两类分布（条位）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AI/地球物理 44 / 传统方法 16&lt;/strong&gt;；每日波动大（09-16、09-18 各达传统 5 条，09-15、09-20 仅 1 条）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;来源结构（逐期波动）&lt;/td&gt;
&lt;td&gt;09-15~09-18 以 arXiv 预印本为主；09-19、09-20 反转为正式期刊为主（8/10）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可复现资产&lt;/td&gt;
&lt;td&gt;本周&lt;strong&gt;首次&lt;/strong&gt;拿到可下载代码/数据：DiffSWE2d（GitHub）、SVGDFWI（Zenodo 代码包）、GPR 扩散正则化 FWI 数据（Zenodo，CC BY 4.0）、PINN Atlas（Zenodo + MIT 代码）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HPC 状态&lt;/td&gt;
&lt;td&gt;⚠️ &lt;strong&gt;连续 6 天无系统/方法学产出&lt;/strong&gt;；第 5 天（09-19）起拿到内存侧量化，第 6 天（09-20）拿到跨平台 GPU 实测基线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开源地震栈&lt;/td&gt;
&lt;td&gt;Devito v4.8.23（2026-08-07）、SPECFEM3D v4.1.1（2024-03-15）、SeisSol v1.3.2（2025-06-17）——&lt;strong&gt;全周无新 release&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对比基线&lt;/td&gt;
&lt;td&gt;本周为周报系列起点，无前序周报可比；但内部按日报做了逐日&quot;重复/升级/新增&quot;归并&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;二、本周主线（跨日归并，7 条；每条标注所涉类别）&lt;/h2&gt;
&lt;h3&gt;主线 1 ·【AI/地球物理】生成式先验 × FWI：从&quot;替代正演-伴随链&quot;转向&quot;与 FWI 协作&quot;&lt;/h3&gt;
&lt;p&gt;本周该方向的四篇工作&lt;strong&gt;没有一个追求端到端替换&lt;/strong&gt;，共同技术关键词是&lt;strong&gt;解耦&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;09-15 #1 PSG&lt;/strong&gt;（arXiv 2609.12899）：用一个&lt;strong&gt;持久物理速度模型&lt;/strong&gt;经 Gaussian bridge 与扩散先验耦合，把&lt;strong&gt;波动方程梯度与去噪器梯度解耦&lt;/strong&gt;，同时保留常规 FWI 的初始化与优化历史。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-15 #2&lt;/strong&gt;（arXiv 2609.05476）：以&lt;strong&gt;共成像点道集（CIG）为条件&lt;/strong&gt;做速度与阻抗联合扩散反演——&lt;strong&gt;速度标签与阻抗标签解耦&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-16 #2 VAE-FWI UQ&lt;/strong&gt;（10.1029/2026JH001389）：&lt;strong&gt;反方向&lt;/strong&gt;——把 FWI 梯度直接反传进网络权重，是本周&lt;strong&gt;耦合最紧&lt;/strong&gt;的一条（⚠️ 上线日 2026-08-28，属窗口外补录）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-20 #4 SVGDFWI&lt;/strong&gt;（Zenodo 21182222，UT Austin，&lt;strong&gt;代码包 91.4 MB 已发布&lt;/strong&gt;）与 &lt;strong&gt;09-20 #5 GPR 扩散正则化 FWI 数据&lt;/strong&gt;（Zenodo 22732464/22732465，桂林理工大学，&lt;strong&gt;CC BY 4.0 实测数据集&lt;/strong&gt;）：把扩散先验当成&lt;strong&gt;正则项&lt;/strong&gt;接进贝叶斯反演。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;本周结论&lt;/strong&gt;：该方向在周内从&quot;单条方法&quot;升级为&lt;strong&gt;独立多源簇&lt;/strong&gt;，并在周末&lt;strong&gt;第一次拿到可复现资产&lt;/strong&gt;（此前 09-15 的 PSG 无代码）。三种推断机制并存：后验采样 / 粒子式变分（SVGD）/ 正则化反演。&lt;/p&gt;
&lt;h3&gt;主线 2 ·【传统方法·可微/数值】可微编程（AD）成为反演默认底座，讨论重心转向&quot;哪种 AD 更稳、更省&quot;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;09-16 #3 ADEPTS&lt;/strong&gt;（arXiv 2609.13482）：地幔对流反演框架，给出 &lt;strong&gt;unrolled vs implicit 两种 AD 策略的明确收敛判据&lt;/strong&gt;——讨论已从&quot;能不能 AD&quot;转向&quot;AD 用哪种方式&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-16 #4 DiffSWE2d&lt;/strong&gt;（arXiv 2609.11426，&lt;strong&gt;代码 github.com/ZhonghouXu/DiffSWE2d&lt;/strong&gt;）：可微浅水方程求解器，端到端洪水/海啸建模。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-20 #1（JAG 106519）&lt;/strong&gt;：&lt;strong&gt;伴随状态算模型空间梯度 + 只对神经重参数化部分用 AD&lt;/strong&gt; 的混合方案，并报告 GPU/CPU 内存伸缩行为——直接针对&quot;AD 显存贵&quot;这一具体工程痛点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-18 #6（GJI ggag358）&lt;/strong&gt;：Hessian-向量积的完整拉格朗日表述与对 AD 的误差评估。⚠️ &lt;strong&gt;明确指出：算子非对称时，常用拉格朗日形式 HVP 的第一项可能错误，用 L† 改写必须计入边界项&lt;/strong&gt;——这是一个会&lt;strong&gt;静默产生错误梯度&lt;/strong&gt;的问题，本周最实用的正确性提醒。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;主线 3 ·【AI/地球物理】概率化 / 不确定性量化：一周内累计 7 条独立工作，已成默认而非选项&lt;/h3&gt;
&lt;p&gt;本周该方向条目：&lt;strong&gt;09-16 #2（VAE）→ 09-18 #3（INN）→ 09-19 #1（Epinet 认知不确定度）、#3（Whittle–Matérn 先验 + HMC）、#4（神经似然 + HMC）→ 09-20 #4（SVGD）、#6（PINN Atlas，含 conformal UQ）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;机制库在本周内扩到四种&lt;/strong&gt;：扩散后验采样、可逆神经网络（INN）、HMC（含神经似然摊销）、SVGD 粒子式变分。&lt;/p&gt;
&lt;p&gt;其中 &lt;strong&gt;09-18 #3 澳洲大陆尺度概率电阻率成像&lt;/strong&gt;（arXiv 2609.19516）给出了本周最硬的一条成本账：&lt;strong&gt;2660 万条测深的概率反演压到 4.37 GPU 小时&lt;/strong&gt;（⚠️ 作者自述，预印本未复核）。INN 的&quot;一次前向得后验&quot;相比扩散的迭代采样，在&quot;每点都要不确定度&quot;的场景下成本结构优势明显。&lt;/p&gt;
&lt;h3&gt;主线 4 ·【两类混合】成本叙事成型：省显存、省 AD、省数据&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;路径&lt;/th&gt;
&lt;th&gt;代表条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;关键做法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;模型极致压缩 + 边缘推理&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-19 #2 XiaoNet（PNAS Nexus pgag322）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;PhaseNet 压缩 &lt;strong&gt;&amp;gt;93% 至 240 KB&lt;/strong&gt;，Raspberry Pi 5 上 30 秒三通道窗推理 &lt;strong&gt;&amp;lt;1 ms&lt;/strong&gt;（⚠️ OpenAlex 把三位作者单位全映射为 &quot;Oklahoma Biological Survey&quot;，与地震监测主题明显不符，&lt;strong&gt;机构映射错误待人工确认&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数学上避开二阶存储&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-19 #5 矩阵自由 GN CSEM（Comput Geosci 30(5):97）&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;Hessian &lt;strong&gt;不构造、不存储、不求逆&lt;/strong&gt;，只做 HV 积 + 随机迹估计阻尼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AD 显存解耦&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-20 #1（JAG 106519）&lt;/td&gt;
&lt;td&gt;AI×传统混合&lt;/td&gt;
&lt;td&gt;伴随状态 + 局部 AD 混合梯度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;非凸拆解绕开 AD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-20 #7 多等级 DL 解 Helmholtz（10.1007/s10915-026-03463-w）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;ReLU 分级把非凸拆成凸子问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;用极稀疏实测替代密集标注&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-19 #8 FLARE-T（arXiv 2609.20451）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;密集有限元仿真学潜动力学 + 极稀疏实测校准（首次出现在&lt;strong&gt;非反演的场地反应正演代理&lt;/strong&gt;上）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;判断&lt;/strong&gt;：本周&quot;便宜&quot;正式成为与&quot;准&quot;并列的卖点，且&lt;strong&gt;五条路径彼此正交&lt;/strong&gt;（压缩 / 数学 / 显存 / 非凸 / 数据）——&lt;strong&gt;AI 线与传统线在&quot;降本&quot;这一目标上第一次正面会师&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;主线 5 ·【传统方法为主】&quot;初始模型 / 先验从哪来&quot;——三条互相独立的答案&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用另一种物理场换&lt;/strong&gt;：09-18 #4 电磁数据驱动的多阶段&quot;预热&quot;FWI（10.1190/geo-2025-0168）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用结构化地质先验&lt;/strong&gt;：09-18 #7 地层格架约束的集合平滑多数据同化（10.1190/geo-2025-0527）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用预训练 + 硬约束微调&lt;/strong&gt;：09-18 #2 密度测井约束的 ResU-Net 三维重力反演（10.1190/geo-2025-0323）【AI】。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把先验写进网络结构&lt;/strong&gt;：09-17 #3 BEIFWI 的 Sobel 层（10.1093/jge/gxag113）【AI】。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;共同点&lt;/strong&gt;：都不试图用更强的优化器硬碰非凸性，而是&lt;strong&gt;先把问题变简单&lt;/strong&gt;。这与 09-17 #5 的非凸性缓解综述（GJI ggag376，传统）构成&quot;问题 → 方案&quot;闭环。&lt;/p&gt;
&lt;h3&gt;主线 6 ·【AI/地球物理为主】基础设施与可信度被当作一等公民&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据/接口标准化&lt;/strong&gt;：09-15 #6 SeisBench DAS（arXiv 2609.07558）、09-15 #8 TREMORS（Agent 化多数据中心取数）、09-16 #7 中石油 220 TB 油气地震勘探大模型数据集（⚠️ 企业新闻口径，未说明基线）、09-16 #8「谛听」大模型工程化推进（⚠️ 二手来源，未验证）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基础模型 + 少量标注&lt;/strong&gt;：09-15 #7 SS-UNETR（75k 无标注实际数据预训练 + 2.8k 合成标注微调）、09-17 #7 DTSEC（&lt;strong&gt;20% 训练数据达到同等性能&lt;/strong&gt;，跨区域退化可用少量本地样本修复）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可信度审计&lt;/strong&gt;：09-15 #10（ML 地震目录人类可验证性审计，⚠️ 偏差可达 20 个百分点量级）、09-17 #4 弹性波 PINN 批判性评估（154 页 44 图）、09-18 #9 明确声明&quot;未超越所有已有方法&quot;并报告负面消融。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 元数据质量警告&lt;/strong&gt;：09-18 发现 &lt;strong&gt;J. Seismic Exploration 的 Crossref 著录标题与出版商页面实际标题完全不符&lt;/strong&gt;（DOI &lt;code&gt;10.36922/jse026250107&lt;/code&gt;，作者与日期相同但内容不相关）；09-19 复核&lt;strong&gt;该错配持续存在&lt;/strong&gt;，且 &lt;code&gt;10.36922/jse026210090&lt;/code&gt; 与之&lt;strong&gt;共用同一标题但作者完全不同&lt;/strong&gt;。&lt;strong&gt;结论：自动文献筛选不能只依赖单一元数据提供商的标题字段。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;主线 7 ·【传统方法·HPC】连续 6 天缺口，但缺口的性质在第 5–6 天发生变化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;09-15 ~ 09-17&lt;/strong&gt;：检索命中的 GPU/RTM/Devito/SPECFEM 内容&lt;strong&gt;几乎全为 SEO 营销页与无 DOI 博客&lt;/strong&gt;，全部剔除。缺口非&quot;领域不用 HPC&quot;，而是&lt;strong&gt;检索路径覆盖不到 HPC 发表渠道&lt;/strong&gt;（无 SC/ISC/IPDPS/PPoPP 类产出）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-18（第 4 天）&lt;/strong&gt;：首次拿到&lt;strong&gt;应用侧&lt;/strong&gt; GPU 成本（4.37 GPU 小时 / 2660 万条测深），但系统/方法学产出仍为零。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-19（第 5 天）&lt;/strong&gt;：首次出现&lt;strong&gt;内存侧&lt;/strong&gt;的明确工程表述（矩阵自由 GN 不构造/不存储/不求逆）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09-20（第 6 天）&lt;/strong&gt;：首次拿到&lt;strong&gt;可引用的跨平台对照基线&lt;/strong&gt;——arXiv 2609.10368 给出 &lt;strong&gt;8 阶 25 点声学模板（即地震 FD 内核）在 7 种 GPU 上的 Gpts/s&lt;/strong&gt;（Intel B70/B580/GPU MAX 1550、NVIDIA A100/RTX6000 Blackwell/H100、AMD MI325x），并对比 TinyTC 与 PyTorch/Triton；另有 &lt;strong&gt;BEAST 在 20,480 张 GH200 上达到 3.96 EFLOP/s&lt;/strong&gt;（arXiv 2609.12815，AI 侧：贝叶斯神经网络），并首次出现**&quot;不确定性并行&quot;作为独立并行维度**。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开源栈全周零 release&lt;/strong&gt;（Devito / SPECFEM3D / SeisSol，本系列已连续多期确认）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;三、本周精选 Top 10（AI/地球物理 6 条 + 传统方法 4 条，整体按相关性排序）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;配比说明&lt;/strong&gt;：本周原 Top 15 经新口径重新归类后，AI/地球物理 11 条、传统方法 4 条。按&quot;AI 6 + 传统 4&quot;配比重排为 Top 10；移出主榜的 5 条（Agentic FWI、VAE-FWI、LMGM、SDI、FWI 非凸综述）进入提名区并标注类别——其中 &lt;strong&gt;Agentic FWI 因摘要与全文均不可得（仅存标题与关键词）降级&lt;/strong&gt;，SDI 与非凸综述分别属&quot;零实验范式宣示&quot;与&quot;综述类&quot;，边际信息量低于其余条目。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1. 三维深度学习参数化弹性 FWI + 伴随状态法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（神经重参数化为核心创新，伴随状态为传统底座）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：期刊著录经 Crossref 核验（具体名单见 DOI 页；日报未展开）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;Journal of Applied Geophysics&lt;/em&gt; 255, 106519 · https://doi.org/10.1016/j.jappgeo.2026.106519 ·〔09-20 #1〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：LSTM 对 vp/vs 做&lt;strong&gt;神经重参数化&lt;/strong&gt;，模型空间梯度用&lt;strong&gt;伴随状态&lt;/strong&gt;求解，&lt;strong&gt;只对重参数化部分使用 AD&lt;/strong&gt;——直接绕开&quot;AD 穿透正演导致显存爆炸&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：3D 各向同性弹性多参数（摘要未给具体工区）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周唯一一条&lt;strong&gt;同时命中 FWI + 弹性多参数 + 3D + AD 显存工程&lt;/strong&gt;的条目，且是&quot;已有成熟伴随代码 + 想引入神经参数化&quot;场景下最可直接抄的结构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 期刊/DOI/日期经 Crossref 核验（&lt;code&gt;created&lt;/code&gt; 2026-09-10，印刷期 2026-12）；⚠️ 具体误差改善数值在受限全文内、无代码声明，&lt;strong&gt;定性结论不可直接引用为性能依据&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 矩阵自由高斯-牛顿反演真实 CSEM 数据&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（二阶优化 / 数值反演工程）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：期刊著录经 Crossref 核验（日报未展开具体名单）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;Computational Geosciences&lt;/em&gt; 30(5):97 · https://doi.org/10.1007/s10596-026-10496-5 ·〔09-19 #5〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：Hessian &lt;strong&gt;既不显式构造、不存储、也不求逆&lt;/strong&gt;，只做 Hessian-向量积 + &lt;strong&gt;随机迹估计阻尼&lt;/strong&gt;；给出两种梯度预条件的对比。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：真实 CSEM（海洋可控源电磁）数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未取到（⚠️ OUP 侧页面被 Cloudflare 拦截）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：把二阶方法从理论推到可落地的&lt;strong&gt;完整工程案例&lt;/strong&gt;。可直接迁移到 FWI 的 Gauss-Newton 变体上，用于评估&quot;值不值得上二阶&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 期刊/DOI 核验；⚠️ 加速比仅给定性描述（&quot;substantially / markedly&quot;）&lt;strong&gt;无倍数&lt;/strong&gt;，需人工看文中表格。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. PSG：物理状态引导的扩散采样 FWI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（扩散生成先验）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：arXiv 摘要页未著录（⚠️）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.12899 · https://arxiv.org/abs/2609.12899 ·〔09-15 #1〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：&lt;strong&gt;持久物理速度模型 + Gaussian bridge&lt;/strong&gt; 耦合扩散先验；物理状态由波形拟合更新并反向引导扩散，&lt;strong&gt;解耦波动方程梯度与去噪器梯度&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：OpenFWI 四族（clean / 缺失道 / 含噪）；冻结的 OpenFWI 先验&lt;strong&gt;零重训迁移&lt;/strong&gt;到 Marmousi、Overthrust、BP2004 Salt。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：摘要页未提供 → &lt;strong&gt;未验证&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周&quot;生成式 × FWI&quot;簇的基线成员；&quot;冻结先验 + 零重训迁移&quot;这一设定对&lt;strong&gt;跨工区复用&lt;/strong&gt;的可行性判断价值高于精度指标本身。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ arXiv 元数据核验；⚠️ 作者单位未提供，代码未验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 地震 Hessian-向量积：完整拉格朗日表述与对自动微分的误差评估&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（数值数学 / 正确性）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：GJI 著录经 Crossref 核验（日报未展开具体名单）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;Geophysical Journal International&lt;/em&gt; · https://doi.org/10.1093/gji/ggag358 ·〔09-18 #6〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：推导地震 HVP 的完整拉格朗日形式，并与 AD 结果做误差对照。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：理论推导 + 数值对照（详见全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键结论&lt;/strong&gt;：&lt;strong&gt;算子非对称时，常用拉格朗日形式的 HVP 第一项可能错误&lt;/strong&gt;；若用 L† 改写，&lt;strong&gt;必须计入边界项&lt;/strong&gt;，否则静默产生错误梯度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;本周最高性价比的一条&quot;正确性&quot;提醒。&lt;/strong&gt; 若项目内已有 HVP / 二阶优化实现，建议按此文核对边界项处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ 期刊/DOI 核验；⚠️ 具体误差数值需读全文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 澳洲大陆尺度概率电阻率成像：可逆神经网络（INN）路线&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（INN 一次前向得后验）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：arXiv 预印本未著录单位（⚠️）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.19516（提交 2026-09-17）· https://arxiv.org/abs/2609.19516 ·〔09-18 #3〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：INN 一次性前向得到后验，绕开扩散模型的迭代采样。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据/规模&lt;/strong&gt;：&lt;strong&gt;2660 万条航空电磁（AEM）测深&lt;/strong&gt;，大陆尺度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未找到（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周&lt;strong&gt;唯一&lt;/strong&gt;给出&quot;大尺度概率反演成本账&quot;的条目（&lt;strong&gt;4.37 GPU 小时&lt;/strong&gt;），且是概率反演四条机制路线中成本结构最优的一条。⚠️ 该路线&lt;strong&gt;此前四天完全未出现在检索结果中&lt;/strong&gt;，属本周最实质的方法学新增。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ 预印本、无 DOI、无代码、单位未著录；&quot;4.37 GPU 小时&quot;为&lt;strong&gt;作者自述&lt;/strong&gt;，引用时必须标注为预印本自述值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. Stencil Computation at the Intersection of AI and HPC（模板计算：AI 与 HPC 的交汇处）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（数值/HPC；AI 张量编译器仅作实现工具）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：arXiv 未登记机构（⚠️）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：arXiv 2609.10368（submitted 2026-09-09，cs.DC）· https://arxiv.org/abs/2609.10368 ·〔09-20 #3〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：用 &lt;strong&gt;AI 张量编译器（TinyTC）与 PyTorch/Triton&lt;/strong&gt; 实现科学计算高阶模板，并与手写核对比。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据/基准&lt;/strong&gt;：&lt;strong&gt;8 阶 25 点声学模板（即地震有限差分内核）在 7 种 GPU 上的 Gpts/s&lt;/strong&gt;：Intel B70 / B580 / GPU MAX 1550、NVIDIA A100 / RTX6000 Blackwell / H100、AMD MI325x。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未取到（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周 HPC 侧&lt;strong&gt;唯一的可引用跨平台对照基准&lt;/strong&gt;，可直接用于&quot;自研 FD 内核 vs 用 AI 编译器生成&quot;的选型判断。注意它测的是&lt;strong&gt;单核性能&lt;/strong&gt;，不含通信与 I/O。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ arXiv 元数据核验；⚠️ 具体表格数值需读全文，机构未在 arXiv 登记。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7. PINN Atlas：物理知情神经网络的量化清算与可复现基准&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（PINN 基准/评测）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：Zenodo 记录与 OpenAlex 机构著录冲突（CAOS open-research programme, Santiago vs Open University of Cyprus）→ 须按作者 ORCID 0000-0002-0150-3246 主页判定（⚠️）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：Zenodo 10.5281/zenodo.22822967（v1.1，2026-09-18；另有同名记录 21517389 / 22834739 → 主记录需人工确认）·〔09-20 #6〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：&lt;strong&gt;17 个用例&lt;/strong&gt;逐一给出相对 L2 误差，按问题类型分层；含 conformal UQ 与保结构 Hamiltonian 学习。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据/结论（分层）&lt;/strong&gt;：平滑正问题&lt;strong&gt;亚 1%&lt;/strong&gt;；&lt;strong&gt;反问题 4e-2&lt;/strong&gt;；&lt;strong&gt;高频 Helmholtz 1.0e-1&lt;/strong&gt;；实测数据&lt;strong&gt;差 2–3 个量级&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：MIT 代码随 Zenodo 发布（✅ 有产物，⚠️ 网页未实际下载验证）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：&lt;strong&gt;可直接引用的立项与拒绝依据&lt;/strong&gt;。用于封死&quot;PINN 替代波动方程求解器&quot;这类提案；同时把 PINN 正确定位为&lt;strong&gt;约束/正则工具&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ Zenodo 记录与日期核验；⚠️ 机构冲突待人工判定。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8. 电磁数据驱动的多阶段&quot;预热&quot;地震全波形反演&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：传统方法（多物理场约束的 FWI 流程；无 DL）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ Crossref 机构串被截断（仅 &quot;Department of Earth and Space Sciences&quot; 与&quot;深圳市深海油气勘探技术重点实验室&quot;），&lt;strong&gt;具体高校为推测&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;Geophysics&lt;/em&gt;（SEG）· https://doi.org/10.1190/geo-2025-0168 ·〔09-18 #4〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：用**另一种物理场（电磁）**提供初始模型，多阶段 warm-up 进入 FWI。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：实测工区未在摘要指明（⚠️）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：在&lt;strong&gt;已有 CSEM / MT 等非地震数据&lt;/strong&gt;的工区，这是一条&quot;先把问题变简单&quot;的低风险路线，比拼优化器更可能直接解决 cycle skipping。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ 机构著录不全；工区信息需读全文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9. TIP-INN：网络&quot;该知道多少物理&quot;被做成可消融的对照实验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（物理约束强度的消融实验设计）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ 设备/机构等细节在日报中标为未验证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;JGR: Machine Learning and Computation&lt;/em&gt; · https://doi.org/10.1029/2026JH001463 ·〔09-19 #1〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：同一任务下对照&lt;strong&gt;软约束&lt;/strong&gt;（Epinet，只学 Helmholtz 自由能）与&lt;strong&gt;硬约束&lt;/strong&gt;（NICE-M，自由能 + 对偶耗散势）；输出含认知不确定度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：热力学算例（详见全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未声明。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周&lt;strong&gt;第一份把&quot;物理约束强度&quot;当作自变量&lt;/strong&gt;的实验设计。此前绝大多数 PINN 类工作只报告&quot;加约束后更好&quot;，&lt;strong&gt;缺少&quot;加多少&quot;的刻度&lt;/strong&gt;。可作为内部物理约束消融的模板。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：⚠️ 摘要与量化数值需读全文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10. XiaoNet：地震震相拾取的模型蒸馏与边缘推理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类别&lt;/strong&gt;：AI/地球物理（模型蒸馏 + 边缘部署）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者/团队&lt;/strong&gt;：⚠️ &lt;strong&gt;机构冲突&lt;/strong&gt;：Crossref 记 &quot;Oklahoma Geological Survey, University of Oklahoma&quot;，OpenAlex 记 &quot;Oklahoma Biological Survey&quot;（与地震监测主题明显不符），需人工确认&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接&lt;/strong&gt;：&lt;em&gt;PNAS Nexus&lt;/em&gt; · https://doi.org/10.1093/pnasnexus/pgag322 ·〔09-19 #2〕&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：把 PhaseNet &lt;strong&gt;压缩 &amp;gt;93% 至 240 KB&lt;/strong&gt;，在 &lt;strong&gt;Raspberry Pi 5&lt;/strong&gt; 上 30 秒三通道窗推理 &lt;strong&gt;&amp;lt;1 ms&lt;/strong&gt;，并给出带宽/延迟层面的系统论证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：连续波形（具体数据集见全文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：未获取（OUP 页面被 Cloudflare 拦截，需人工浏览器打开查 Data/Code Availability）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对本项目的启发&lt;/strong&gt;：本周&quot;AI 从更大转向更省&quot;的代表。若项目涉及&lt;strong&gt;台站侧/边缘部署&lt;/strong&gt;，这是可直接对标的配置。⚠️ 摘要只说 &quot;strong performance&quot;，&lt;strong&gt;无 F1/拾取误差&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证状态&lt;/strong&gt;：✅ DOI 核验；⚠️ 机构冲突与性能数字缺失。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;本周提名区（第 11–25 位，供追踪，不展开；标注类别）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;来源&lt;/th&gt;
&lt;th&gt;首次收录&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Agentic FWI Using Local and Global Optimizers（摘要/全文不可得，&lt;strong&gt;降级原因见配比说明&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1007/s11004-026-10342-5&lt;/td&gt;
&lt;td&gt;09-17 #1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;VAE-FWI：不依赖预训练标注的 FWI 不确定性量化（上线日 08-28 属窗口外补录；&lt;strong&gt;FWI 梯度直接反传进网络权重&lt;/strong&gt;，产出形态为&quot;一组模型 + 方差&quot;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1029/2026JH001389&lt;/td&gt;
&lt;td&gt;09-16 #2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;LMGM：三维地震勘探轻量全局建模（Mamba/状态空间模型，线性复杂度）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2609.18294&lt;/td&gt;
&lt;td&gt;09-17 #2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;SDI：Structure-Driven Inversion 范式宣示（零实验零代码；作者 12 天内两篇，季度级跟踪）&lt;/td&gt;
&lt;td&gt;传统（范式）&lt;/td&gt;
&lt;td&gt;arXiv 2609.16536&lt;/td&gt;
&lt;td&gt;09-16 #1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;FWI 非凸性缓解策略综述（摘要与关键词均无 ML 词，&lt;strong&gt;不含 AI 章节的假设未验证&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;传统（综述）&lt;/td&gt;
&lt;td&gt;10.1093/gji/ggag376&lt;/td&gt;
&lt;td&gt;09-17 #5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Pn 波层析 + 深度学习拾取（Seis-PnSn；俯冲带分段等可检验地质结论）&lt;/td&gt;
&lt;td&gt;传统（AI 辅助）&lt;/td&gt;
&lt;td&gt;10.1029/2026JB034108&lt;/td&gt;
&lt;td&gt;09-16 #5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;DiffSWE2d：可微浅水方程求解器（&lt;strong&gt;有 GitHub 代码&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;传统（可微）&lt;/td&gt;
&lt;td&gt;arXiv 2609.11426&lt;/td&gt;
&lt;td&gt;09-16 #4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;结构感知贝叶斯 FWI：扩散正则化 SVGD（&lt;strong&gt;Zenodo 代码包 91.4 MB&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.5281/zenodo.21182222&lt;/td&gt;
&lt;td&gt;09-20 #4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;时移 GPR 成像的物理引导扩散正则化 FWI 支持数据（&lt;strong&gt;Zenodo，CC BY 4.0&lt;/strong&gt;）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.5281/zenodo.22732464&lt;/td&gt;
&lt;td&gt;09-20 #5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;4D 并行解锁百亿亿次级贝叶斯神经网络（20,480×GH200，3.96 EFLOP/s；首个&quot;不确定性并行&quot;维度）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2609.12815&lt;/td&gt;
&lt;td&gt;09-20 #8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;SS-UNETR：3D 地震图像地质特征分析的半监督预训练基础模型&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1190/GEO-2024-0788&lt;/td&gt;
&lt;td&gt;09-15 #7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;SeisBench DAS：分布式声学传感的机器学习框架（格式/接口标准化）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;arXiv 2609.07558&lt;/td&gt;
&lt;td&gt;09-15 #6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;多等级深度学习自适应求解高频 Helmholtz 方程&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1007/s10915-026-03463-w&lt;/td&gt;
&lt;td&gt;09-20 #7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;地层格架约束的集合平滑多数据同化叠后反演&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;10.1190/geo-2025-0527&lt;/td&gt;
&lt;td&gt;09-18 #7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;边界增强连续表示 FWI（BEIFWI，Sobel 集成 CNN）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;10.1093/jge/gxag113&lt;/td&gt;
&lt;td&gt;09-17 #3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;四、本周全量条目索引（60 条位，按日报原序；含类别列）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;用途：&lt;strong&gt;兜底检索入口&lt;/strong&gt;。任何一条都能通过链接直达；完整方法/数据/代码/启发字段请回到对应日报。
类别标注为本文件按&quot;分类口径&quot;对日报内容的重新归类，&lt;strong&gt;不改变日报原文&lt;/strong&gt;。标注&quot;（AI 辅助）&quot;= AI 仅作拾取/预处理等辅助环节；标注&quot;（可微）&quot;= ML 框架仅作求导工具、无学习组件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2026-09-15（窗口 09-08 ~ 09-15，7 天；自动扩展至 14 天）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Physical-State-Guided Diffusion Sampling for FWI（PSG）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.12899&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Bayesian Joint Velocity and Impedance Inversion via Diffusion Models Conditioned on CIG&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.05476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;ROMNet: hybrid reduced order modeling + ML for waveform inversion&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2608.25160&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;PSDWII: Physical-Structure-Driven Waveform Inversion Imaging&lt;/td&gt;
&lt;td&gt;传统（范式）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.03380&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Should All Noises Be Treated Equally: Input Noise Variability &amp;amp; NN Robustness&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.14504 ／ https://doi.org/10.1029/2025JH000968&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;SeisBench DAS: ML framework for Distributed Acoustic Sensing&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.07558&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Semi-Supervised Pre-trained Foundation Model for 3D Geological Feature Analysis（SS-UNETR）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/GEO-2024-0788&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;TREMORS: An Agentic Assistant for Multi-Datacenter Seismic Data Acquisition&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.01777&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;A Frequency-Aware Dynamic Knowledge Distillation Framework（FADKD-Net）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.00828&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;How much of a machine-learning earthquake catalogue can an expert verify?&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.31223/X5MZ2D&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-16（窗口 09-09 ~ 09-16）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Structure-Driven Inversion: A New Paradigm for Solving Inverse Problems（SDI）&lt;/td&gt;
&lt;td&gt;传统（范式）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.16536&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Physics-Constrained VAE for Uncertainty Quantification of FWI&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2026JH001389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;ADEPTS: auto-differentiable framework for mantle convection inversion&lt;/td&gt;
&lt;td&gt;传统（可微）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.13482&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;DiffSWE2d: differentiable Shallow Water Equations solver&lt;/td&gt;
&lt;td&gt;传统（可微）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.11426 ／ 代码 https://github.com/ZhonghouXu/DiffSWE2d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Pn 波层析 + 深度学习震相拾取（Seis-PnSn）&lt;/td&gt;
&lt;td&gt;传统（AI 辅助）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2026JB034108&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Adaptive and accuracy-aware multiple data assimilation（ES-MDA-A2）&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.16434&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;油气地震勘探大模型高质量数据集（220 TB）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://news.cnpc.com.cn/system/2026/09/10/030202630.shtml&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&quot;谛听&quot;地震大模型工程化推进（乌鲁木齐研讨班 + 山东调研）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://www.cea-igp.ac.cn/cxdt/281826.html&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Data-driven reconstruction of 3D particle distributions using wave measurements + DL&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1088/1361-665X/aea278&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;A Self-Diagnosing Structural Error-Aware Parameter Estimation Method for Earth System Models&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.16210&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-17（窗口 09-10 ~ 09-17）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Agentic Full-Waveform Inversion Using Local and Global Optimizers&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s11004-026-10342-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;LMGM: general lightweight global modeling framework for 3D seismic exploration&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.18294&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Boundary-Enhanced Continuous Representation FWI with Sobel-Integrated CNN（BEIFWI）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/jge/gxag113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Solving the Elastic Wave Equation with PINNs: A Robust and Critical Assessment&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.07983&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;A comprehensive review of strategies to mitigate non-convexity in FWI&lt;/td&gt;
&lt;td&gt;传统（综述）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag376&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Research on a DL-Based Inversion Method for Surface Wave Dispersion Spectra（INVNET）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2026JH001472&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;DTSEC: Seismic Event Classifier via Fine-Tuning of a Pretrained Seismogram Foundation Model&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1785/0220260150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;PISAS v1.0: Physics-Informed Neural Surrogate for Earthquake Productivity&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.5194/egusphere-2026-4241&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Bayesian inversion of multilayer CO2 migration from seismic plume observations&lt;/td&gt;
&lt;td&gt;传统（贝叶斯反演）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.04937&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Hourly U.S.-wide flood simulation beyond traditional and data-driven models（dHBV2.0MTS-MC）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.06794&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-18（窗口 09-11 ~ 09-18）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Generative AI for seismic signal processing and imaging: status and perspectives&lt;/td&gt;
&lt;td&gt;AI（综述）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s11430-025-2038-7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Enhanced 3D gravity inversion using ResU-Net with density-logging constraints&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2025-0323&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Continental-scale probabilistic resistivity imaging of Australia using DL（INN）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.19516&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Multistage warm-up seismic FWI informed by electromagnetic data&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2025-0168&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;FWI Cycle-Skipping Mitigation with DTW, Part 2: An Intermediate Signal Approach&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s00024-026-04116-7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Seismic Hessian vector products: Lagrangian formulation and AD error assessment&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag358&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Stratigraphy-guided ensemble smoother multidata assimilation for poststack inversion&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/geo-2025-0527&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Nonlinear seismic inversion in triaxial stress-induced anisotropic media&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag366&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Ensembles of lightweight U-Net with EfficientNet encoders for seismic segmentation&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.36922/jse026260116&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Deep reinforcement learning for strategic drilling&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1190/int-2025-0046&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-19（窗口 09-12 ~ 09-19；arxiv geo-ph 主窗口仅 19 条）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;How Much Physics Should a Neural Network Know?（TIP-INN / NICE-M）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2026JH001463&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Edge seismic phase picking: Model distillation for multimodal early-warning（XiaoNet）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/pnasnexus/pgag322&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Bayesian Framework with Geology-Informed Structural Priors for Tomography + UQ&lt;/td&gt;
&lt;td&gt;传统（贝叶斯反演）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag374&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Neural Surrogate HMC: Neural Likelihoods for HMC in Simulation-Based Inference&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1029/2025JH001164&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;A matrix-free Gauss-Newton inversion of realistic CSEM data&lt;/td&gt;
&lt;td&gt;传统&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s10596-026-10496-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Automatic segmentation of microseismic monitoring signal under low SNR（SEU-Net）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1371/journal.pone.0358562&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Learning-Based Methods and the Future of Numerical Ocean and Sea-Ice Modeling&lt;/td&gt;
&lt;td&gt;AI（综述）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1146/annurev-marine-040125-074353&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Seismic Site Response Prediction from Sparse Observations（FLARE-T）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.20451&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Early warning of mine seismic events via spatiotemporal information transformation（SDPM）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1038/s44304-026-00272-x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Enhanced View of the Mw 6.4 Petrinja Sequence Using Deep Learning（PESMLC）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.26443/seismica.v5i2.1770&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2026-09-20（窗口 09-13 ~ 09-20）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;条目&lt;/th&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Three-dimensional deep learning parameterized elastic FWI with adjoint-state method&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1016/j.jappgeo.2026.106519&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Physics-guided deep learning for subsurface characterization: A critical review&lt;/td&gt;
&lt;td&gt;AI（综述）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1016/j.jappgeo.2026.106515&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Stencil Computation at the Intersection of AI and HPC&lt;/td&gt;
&lt;td&gt;传统（HPC）&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.10368&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Structure-aware Bayesian FWI via diffusion-regularized SVGD（SVGDFWI）&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.5281/zenodo.21182222&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Supporting GPR Data for Time-Lapse Imaging … Diffusion-Regularized FWI&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.5281/zenodo.22732464&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;A Physics-Informed Neural Network Atlas&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.5281/zenodo.22822967&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;The Adaptive Solution of High-Frequency Helmholtz Equations via Multi-Grade DL&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1007/s10915-026-03463-w&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;4D Parallelism Unlocks Exascale Bayesian Neural Networks&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;https://arxiv.org/abs/2609.12815&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Bayesian Gaussian Process Framework for Discrete Inversion of 2D Gravity Data（InDIA）&lt;/td&gt;
&lt;td&gt;AI（ML·高斯过程）&lt;/td&gt;
&lt;td&gt;https://doi.org/10.1093/gji/ggag375&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Advances in Deep Learning Applications for Slow Earthquake Research&lt;/td&gt;
&lt;td&gt;AI（综述）&lt;/td&gt;
&lt;td&gt;见日报原文（09-20）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;五、本周演化：重复 / 升级 / 新增方向（分两线）&lt;/h2&gt;
&lt;h3&gt;5.A AI/地球物理线&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;重复（跨日再次命中，只保留首次收录）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LMGM（2609.18294）&lt;/strong&gt;——09-17 首收，09-19、09-21 复现，&lt;strong&gt;仍为 v1、无代码、无新增实验&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;澳洲电阻率成像（2609.19516）&lt;/strong&gt;——09-18 首收，09-19、09-20 复现，同上。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;升级（前日&quot;信号&quot;→ 后续拿到可核验证据）&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;升级项&lt;/th&gt;
&lt;th&gt;轨迹&lt;/th&gt;
&lt;th&gt;结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XiaoNet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-19 收录时&quot;摘要未获取、性能数字缺失&quot; → 09-22 经 OpenAlex 取到完整摘要（&amp;gt;93% 压缩 / 240 KB / 亚毫秒）&lt;/td&gt;
&lt;td&gt;✅ 数字可用；⚠️ &lt;strong&gt;同时暴露 OpenAlex 机构映射错误&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PINN 定位&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-17 #4 批判性评估（定性）→ 09-20 #6 PINN Atlas（17 例逐例误差）&lt;/td&gt;
&lt;td&gt;✅ 从&quot;定性争论&quot;升级为&quot;有公开基准可引用&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;新增方向（此前未出现）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🆕 模型蒸馏 + 边缘推理进入地震监测（XiaoNet）&lt;/li&gt;
&lt;li&gt;🆕 &quot;网络该知道多少物理&quot;做成可消融自变量（TIP-INN vs NICE-M）&lt;/li&gt;
&lt;li&gt;🆕 神经似然 + HMC 的摊销式贝叶斯（Neural Surrogate HMC）&lt;/li&gt;
&lt;li&gt;🆕 神经重参数化 + 伴随状态的 3D 弹性 FWI（JAG 106519）&lt;/li&gt;
&lt;li&gt;🆕 可复现的 PINN 方法图谱 / 精度分层基准（PINN Atlas）&lt;/li&gt;
&lt;li&gt;🆕 SVGD 粒子式变分推断进入贝叶斯 FWI（SVGDFWI，概率化第 4 种机制）&lt;/li&gt;
&lt;li&gt;🆕 &quot;不确定性并行&quot;作为独立并行维度（BEAST）&lt;/li&gt;
&lt;li&gt;🆕 输入表示域的系统性消融基准（去噪，以下游任务为指标）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.B 传统方法线&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;重复&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SDI（2609.16536）&lt;/strong&gt;——09-16 首收，09-19、09-20 连续复现无更新（范式宣示类，归传统线跟踪）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;升级&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;升级项&lt;/th&gt;
&lt;th&gt;轨迹&lt;/th&gt;
&lt;th&gt;结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pn 波层析（Seis-PnSn）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-15 列入&quot;延伸观察&quot;，日期未验证 → 09-16 经 Crossref + 中科院地质地球所官方页核实&lt;/td&gt;
&lt;td&gt;✅ 拿到 DOI、卷期、上线日、模型名、20 余万条 Pn 到时数据 → &lt;strong&gt;由延伸观察升入主榜&lt;/strong&gt;（传统方法 + AI 辅助拾取）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PSDWII → SDI 范式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-15 #4 只是&quot;虚源投影&quot;单点方法 → 09-16 #1 被正式提升为独立范式（含 MSDPII、PSDBP 两分支）&lt;/td&gt;
&lt;td&gt;✅ 相关性上调，但&lt;strong&gt;仍零实验零代码&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HPC 缺口&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-15 ~ 09-18 全是营销页 → 09-18 首次拿到应用侧 GPU 小时数 → 09-19 内存侧表述（矩阵自由 GN）→ 09-20 跨平台 Gpts/s 基线&lt;/td&gt;
&lt;td&gt;⚠️ 性质从&quot;缺信息&quot;变为&quot;有应用侧基线，仍无系统侧方法学&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;元数据错配&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-18 首次发现 J. Seismic Exploration Crossref 标题与出版商页面不符 → 09-19 复核&lt;strong&gt;依然不符&lt;/strong&gt;，且新增共用标题但作者不同的记录&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;确认该刊 Crossref 著录在本窗口内持续不可靠&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;新增方向&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🆕 矩阵自由二阶优化落地到电磁反演（随机迹估计阻尼 + 预条件对比的完整工程案例）&lt;/li&gt;
&lt;li&gt;🆕 HVP 拉格朗日表述的边界项正确性警告（会静默产生错误梯度）&lt;/li&gt;
&lt;li&gt;🆕 DTW 中间信号法缓解 cycle skipping（Part 2）&lt;/li&gt;
&lt;li&gt;🆕 可微求解器拿到可访问代码（DiffSWE2d，GitHub）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.C 两线交叉观察&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;降本&quot;目标上两线会师&lt;/strong&gt;：AI 线（压缩/蒸馏、神经参数化降显存）与传统线（矩阵自由二阶、AD 策略选择）在&quot;省算力&quot;上给出&lt;strong&gt;互补而非竞争&lt;/strong&gt;的方案（见主线 4 表）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 辅助型条目（如 Seis-PnSn）是两线的天然接口&lt;/strong&gt;：传统层析为主体、DL 拾取为输入端。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确性审计在两线同时出现&lt;/strong&gt;：AI 线（PINN 批判性评估、ML 目录审计）与传统线（HVP 边界项）——&quot;你确定你算的是对的吗&quot;是本周两线共同的一等问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;六、本周趋势总结（分两线）&lt;/h2&gt;
&lt;h3&gt;6.A AI/地球物理线&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;生成式先验正在从&quot;替代 FWI&quot;转向&quot;与 FWI 协作&quot;&lt;/strong&gt;，技术关键词是&lt;strong&gt;解耦&lt;/strong&gt;（波动方程梯度 ↔ 去噪器梯度、速度标签 ↔ 阻抗标签）。这比 2023–2024 年那批&quot;U-Net 直接回归速度场&quot;在可解释性与可控性上进了一步。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概率化/不确定性从选项变成默认&lt;/strong&gt;：连续 6 天、7 条独立工作指向同一结论——&lt;strong&gt;做反演而不给不确定度，正在变成不被接受的默认状态&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 的重心开始从&quot;更大&quot;向&quot;更省&quot;双向分裂&lt;/strong&gt;（XiaoNet 240 KB 边缘推理 vs 大模型/基础模型工作）。&lt;strong&gt;不是所有问题都要靠堆卡解决。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;物理约束的硬保证&quot;开始取代&quot;损失惩罚&quot;&lt;/strong&gt;（PISAS 解析解码器把物理一致性变成结构上不可能违反；Sobel 层把边界先验变成结构）——比&quot;加一个物理损失项&quot;高一个层级。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;物理约束到什么程度&quot;首次被当成可消融的自变量&lt;/strong&gt;（TIP-INN vs NICE-M）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可信度审计成为一等公民&lt;/strong&gt;：ML 目录可验证性（偏差可达 20 个百分点量级）、PINN 批判性评估（154 页 44 图）、&quot;哪些方法上了实测数据&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基础设施成为主战场&lt;/strong&gt;：220 TB 数据集、&quot;谛听&quot;、SeisBench DAS 标准化、TREMORS Agent 化取数——&lt;strong&gt;瓶颈正从算法侧迁移到数据供给与算力调度侧&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DL 拾取的下游价值首次形成完整闭环&lt;/strong&gt;（5 年 DL 拾取量 &amp;gt; 58 年人工目录累积量 → 可检验地质结论）；&lt;strong&gt;评价 AI-FWI 不应只看整体 SSIM，要看深层、盐下、强衰减等尾部构造&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;稀有事件/尾部样本是&quot;物理嵌入&quot;相对&quot;纯数据驱动&quot;的真正优势区&lt;/strong&gt;（≥100 年一遇洪峰上量级误差降 34%，整体技巧与纯 AI 相当）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.B 传统方法线&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可微编程（AD）从&quot;技巧&quot;变成&quot;默认底座&quot;&lt;/strong&gt;，讨论重心已从&quot;能不能 AD&quot;转向&quot;&lt;strong&gt;AD 的哪一种方式更稳/更省&lt;/strong&gt;&quot;（ADEPTS 的 unrolled vs implicit 判据）。这是领域技术成熟的标志。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二阶优化的工程化落地&lt;/strong&gt;：矩阵自由 GN（不构造/不存储/不求逆 + 随机迹阻尼 + 预条件对比）给出完整案例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确性优先&lt;/strong&gt;：HVP 边界项问题（静默错误梯度）是本周传统线最实用的提醒。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;先把问题变简单&quot;成为对抗非凸性的主流姿势&lt;/strong&gt;：多物理场初始模型、地质先验、多阶段 warm-up——与优化器层面的努力互补。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反演的&quot;精度—算力&quot;权衡开始被显式建模为用户可调接口&lt;/strong&gt;（ES-MDA-A2 的&quot;目标准确度 + 最大同化次数&quot;两个旋钮）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ HPC 侧连续 6 天无系统/方法学产出&lt;/strong&gt;，第 6 天才拿到可引用的跨平台实测基线。&lt;strong&gt;缺口不是&quot;地球物理不用 HPC&quot;，而是&quot;检索路径覆盖不到 HPC 发表渠道&quot;&lt;/strong&gt;——信息源问题，不是领域问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 元数据质量是需要警惕的信号&lt;/strong&gt;：Crossref 对 J. Seismic Exploration 的著录持续错位。&lt;strong&gt;自动筛选必须交叉验证出版商页面。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.C 综合判断&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;本周两线的产出比约为 44:16（AI:传统）&lt;/strong&gt;。AI 线在&quot;生成式先验、概率化、降本&quot;三条线上多点开花；传统线的贡献集中于&lt;strong&gt;底座正确性与工程化&lt;/strong&gt;（HVP、矩阵自由 GN、AD 策略、跨平台基线）。&lt;strong&gt;两线不是替代关系：AI 线的每一条&quot;更省&quot;主张，背后都站着一个传统线的工程前提。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;七、对项目的行动建议（本周合并版）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;课题口径仍为默认的 &lt;strong&gt;AI + HPC + 地震数据处理 + FWI&lt;/strong&gt;。以下按&quot;投入成本 × 预期收益&quot;排序，&lt;strong&gt;均为建议，未执行任何操作&lt;/strong&gt;。括号内为所属线别。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;A. 立即可做（低风险、低成本，1–3 天）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;核对现有二阶/伴随实现的 HVP 边界项&lt;/strong&gt;——依据 GJI ggag358（传统线）。这是本周&lt;strong&gt;唯一一条可能导致静默错误梯度&lt;/strong&gt;的提醒，优先级最高。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建立&quot;物理约束强度&quot;消融模板&lt;/strong&gt;——参照 TIP-INN vs NICE-M 的设计（AI 线），把软约束与硬约束做成同一任务下的对照臂。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把 DiffSWE2d、SVGDFWI、PINN Atlas 三份可复现资产加入候选池&lt;/strong&gt;（分别对应可微求解器〔传统/可微〕、贝叶斯 FWI〔AI〕、PINN 基准〔AI〕）。三者均有可访问产物，&lt;strong&gt;至少值得跑通一次环境&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在评测清单里加入两条硬性要求&lt;/strong&gt;：① 尾部构造（深层/盐下/强衰减）单独报指标；② 去噪类任务补下游指标（检测率、到时、极性）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把&quot;合成排名不能代表实测排名&quot;&quot;元数据标题不可全信&quot;两条写进内部文献筛选规范&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;B. 需要评估（有收益但需先做可行性判断，1–4 周）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;评估 INN 路线做概率反演的可行性&lt;/strong&gt;——依据 09-18 #3（2660 万条测深 / 4.37 GPU 小时，作者自述）。重点不是精度，是**&quot;每点都要不确定度&quot;场景下的成本结构**（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为 3D 体数据长程依赖任务做 LMGM（Mamba）对照&lt;/strong&gt;——线性复杂度是本周与算力账最直接相关的一条（AI 线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估&quot;用电磁/其他物理场换 FWI 初始模型&quot;是否在现有工区可行&lt;/strong&gt;——依据 09-18 #4（传统线）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估自研 FD 内核 vs AI 张量编译器的性价比&lt;/strong&gt;——依据 09-20 #3 的 7 平台 Gpts/s 基线（传统/HPC 线）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;C. 仅记录（暂不投入）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SDI / PSDWII 类&quot;零实验零代码&quot;的范式宣示&lt;/strong&gt;（传统线）——季度级跟踪，&lt;strong&gt;不作立项依据&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic FWI（10.1007/s11004-026-10342-5）&lt;/strong&gt;（AI 线）——摘要与全文均不可得，&lt;strong&gt;在读到全文前不做任何技术判断&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企业新闻口径的效率数字&lt;/strong&gt;（如 220 TB 数据集的&quot;效率提升 9–12 倍&quot;）——引用时必须标注来源性质。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;D. HPC 侧的具体提醒&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;建议补订稳定的 HPC 信息源&lt;/strong&gt;：SC / ISC / IPDPS / PPoPP 会议论文、NVIDIA GTC 技术日程、SEG/EAGE 年会技术程序、&lt;strong&gt;SPECFEM / Devito / SeisSol 官方 release notes 与 GitHub releases&lt;/strong&gt;。本周 6 天的缺口本质是检索路径问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开源栈下周复查项&lt;/strong&gt;（本周实测均无新版本）：Devito v4.8.23 / 2026-08-07；SPECFEM3D v4.1.1 / 2024-03-15；SeisSol v1.3.2 / 2025-06-17。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&quot;内存而非 FLOPs&quot;这一信号&lt;/strong&gt;：本周已出现矩阵自由 GN（不存储 Hessian）。若内部在做架构选型，把内存占用作为&lt;strong&gt;硬约束&lt;/strong&gt;而非事后优化项。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;八、未解决项 / 需人工确认&lt;/h2&gt;
&lt;h3&gt;8.1 结构性问题（本周持续）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 模板变量连续未注入&lt;/strong&gt;：&lt;code&gt;{{date}}&lt;/code&gt; / &lt;code&gt;{{lookback_days}}&lt;/code&gt; / &lt;code&gt;{{history_dir}}&lt;/code&gt; / &lt;code&gt;{{lookback_reports}}&lt;/code&gt; / &lt;code&gt;{{project}}&lt;/code&gt; 全部为原始占位符，6 份日报全部沿用默认值（7 天 / 扩展 14 天 / 默认课题语境）。&lt;strong&gt;建议修改自动化配置注入实际值。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;project&lt;/code&gt; 未指定&lt;/strong&gt;：所有&quot;对项目的启发&quot;均按默认课题语境撰写，若实际项目有具体工区、正反演代码或集群环境，请补充后重跑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;历史基线薄弱&lt;/strong&gt;：&lt;code&gt;lookback_reports = 7&lt;/code&gt;，但 09-15 时目录内 0 份、09-20 时仅 5 份。建议积累 5–7 份后再评估&quot;新增方向&quot;的统计意义。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;8.2 代码/数据可用性（本周统计）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本周 60 条位中，明确给出可访问代码/数据链接的仅 4 条&lt;/strong&gt;：DiffSWE2d（GitHub，传统/可微）、SVGDFWI（Zenodo，AI）、GPR 扩散正则化数据（Zenodo，AI）、PINN Atlas（Zenodo + MIT，AI）。&lt;/li&gt;
&lt;li&gt;其余条目&lt;strong&gt;摘要页均未提供仓库链接&lt;/strong&gt;，请勿据此认定开源。&lt;/li&gt;
&lt;li&gt;⚠️ SVGDFWI 的 Zenodo 记录&lt;strong&gt;未明示 license&lt;/strong&gt;，再分发前必须确认；GPR 数据存在&lt;strong&gt;双 DOI（22732464 / 22732465）&lt;/strong&gt;，主记录需人工判定。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.3 跨期悬置项（截至 2026-09-20，含悬置天数）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项&lt;/th&gt;
&lt;th&gt;悬置&lt;/th&gt;
&lt;th&gt;建议动作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Princeton RSE WebGPU/WGSL 可移植地震求解器&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;第 6 次未验证&lt;/strong&gt;（09-15 起）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;建议人工浏览器确认一次后结案，或直接放弃&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Science China Earth Sciences 生成式 AI 综述摘要&lt;/strong&gt;（10.1007/s11430-025-2038-7）&lt;/td&gt;
&lt;td&gt;连续第 3 天未获取&lt;/td&gt;
&lt;td&gt;09-21 已拿到作者/单位/出版日（电子科技大学 / Mansoura / 清华，2026-09-14），&lt;strong&gt;仅摘要缺失&lt;/strong&gt;；&lt;strong&gt;需人工浏览器打开一次并回填&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IEEE TGRS 多参数地震反演 DOI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-17 起悬置&lt;/td&gt;
&lt;td&gt;只有南阳理工学院宣传稿，&lt;strong&gt;确认 DOI 前不得引用&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DP-Inv 作者数分歧&lt;/strong&gt;（Crossref 4 位 vs Springer 目次 3 位）&lt;/td&gt;
&lt;td&gt;09-15 起&lt;/td&gt;
&lt;td&gt;人工确认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;J. Seismic Exploration 元数据错配&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;第 2 天（已复核仍存在）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;结论已定型：该刊 Crossref 著录不可靠，自动筛选必须交叉验证出版商页面&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OUP（academic.oup.com）Cloudflare 拦截&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-20 起&lt;/td&gt;
&lt;td&gt;GJI 多条代码/数据声明只能人工浏览器打开&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DTW-ISA 的计算开销&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-18 起&lt;/td&gt;
&lt;td&gt;DTW 为 O(N·M)，长记录多道下可能成为瓶颈，&lt;strong&gt;需读全文确认能否上生产链路&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FDCompGraph 是否开源 / aea999 多保真度参数化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-19 起&lt;/td&gt;
&lt;td&gt;无新证据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XiaoNet 机构冲突&lt;/strong&gt;（Crossref vs OpenAlex）&lt;/td&gt;
&lt;td&gt;09-20 起&lt;/td&gt;
&lt;td&gt;到出版商页或作者主页确认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDPM 单位可疑&lt;/strong&gt;（OpenAlex 映射问题）&lt;/td&gt;
&lt;td&gt;09-20 起&lt;/td&gt;
&lt;td&gt;到 nature.com 页面确认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PESMLC 目录是否发布&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-20 起&lt;/td&gt;
&lt;td&gt;到 seismica 页面确认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Applied Geophysics 09-09 那批论文的摘要&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;持续&lt;/td&gt;
&lt;td&gt;出版商未向 Crossref/OpenAlex 提供结构化摘要，&lt;strong&gt;只能人工取 PDF&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agentic FWI 摘要&lt;/strong&gt;（10.1007/s11004-026-10342-5）&lt;/td&gt;
&lt;td&gt;09-17 起&lt;/td&gt;
&lt;td&gt;全文闭源，&lt;strong&gt;连续多期无法推进&lt;/strong&gt;，建议人工判断是否继续投入检索预算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;eDWI（geo-2025-0147）摘要截断&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;09-18 起&lt;/td&gt;
&lt;td&gt;Crossref 与 OpenAlex 均在 &quot;applications using seismic and other wave&quot; 处断掉，需从出版商获取完整摘要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;研究机构缺失的 arXiv 条目&lt;/strong&gt;（2609.10368、2609.12815、2609.12115 等）&lt;/td&gt;
&lt;td&gt;09-20 起&lt;/td&gt;
&lt;td&gt;取 PDF 首页人工核对&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;8.4 需人工确认的性能数字（本周）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;本周主榜 60 条位中，给出可直接引用量化数字的仅约 1/5&lt;/strong&gt;，其余为定性表述（&quot;substantially&quot;&quot;more accurate&quot;&quot;promising&quot;）。已逐条在日报中标注。&lt;strong&gt;任何基于本周条目做的选型决策都应以自复现为准，不要直接引用摘要里的形容词。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;九、检索说明与本文件生成方式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本文件不是检索产物&lt;/strong&gt;。生成过程为：读取 &lt;code&gt;AI每日总结_2026-09-15.md&lt;/code&gt; ~ &lt;code&gt;AI每日总结_2026-09-20.md&lt;/code&gt; 六份原文 → 按 ISO 周归并 → 抽取各期&quot;〇 对比&quot;&quot;趋势总结&quot;&quot;未解决项&quot; → 合并同一条目的升级轨迹 → &lt;strong&gt;按&quot;AI/地球物理 + 传统方法&quot;两分类重新归类并标注&lt;/strong&gt; → 按 AI 6 + 传统 4 配比重排 Top 10 → 输出本文件。&lt;strong&gt;未访问任何外部数据源。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两类条数分布&lt;/strong&gt;：60 条位中 &lt;strong&gt;AI/地球物理 44 条 / 传统方法 16 条&lt;/strong&gt;（每日分布：09-15 为 9:1、09-16 为 5:5、09-17 为 8:2、09-18 为 5:5、09-19 为 8:2、09-20 为 9:1）。精选 Top 10 配比 &lt;strong&gt;6:4&lt;/strong&gt;；传统方法条数充足（16 条 ≥ 4），&lt;strong&gt;无需&quot;凑数&quot;&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;历史重复/升级/新增&lt;/strong&gt;：本周期为系列起点，无前序周报可比；周内跨日重复 3 条（SDI〔传统〕、LMGM〔AI〕、INN 澳洲〔AI〕）、升级项分两线列于第五节、新增方向 AI 线 8 项 + 传统线 4 项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分类判定说明（边界条目的归类原则）&lt;/strong&gt;：① AI 仅作辅助（如 DL 拾取 + 层析的 Seis-PnSn）→ 传统（AI 辅助）；② ML 框架仅作求导/计算工具、无学习组件（如 ADEPTS、DiffSWE2d）→ 传统（可微）；③ SDI 等不以 DL 为核心的范式宣示类 → 传统（范式）；④ 高斯过程等经典统计学习为核心 → AI（ML）；⑤ BeJNV 混合结构（JAG 106519）按&quot;核心创新在哪侧&quot;归 AI，并在类别行注明传统底座。&lt;strong&gt;归类为整理动作，不代表对论文创新性的判断；若与原文自述不符，以原文为准。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 2026-10-08 变更&lt;/strong&gt;：按用户要求，本周期 6 份日报已随全部 12 份历史日报移出主目录，现留存于工作区 &lt;code&gt;.回收站_日报_2026-10-08/&lt;/code&gt; 与外部备份 &lt;code&gt;/home/liguolong/geo_scratch/backup_日报_2026-10-08/&lt;/code&gt;（删除前校验一致）。&quot;回溯入口&quot;请改到上述两处查阅。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;诚实性声明&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;所有链接、作者、机构、日期、数字&lt;strong&gt;均转述自日报原文&lt;/strong&gt;，日报未验证的一律沿用&quot;未验证/需人工确认&quot;标注，本文件未做任何新的推断或补齐。&lt;/li&gt;
&lt;li&gt;日报中被标注为&quot;依据标题推断&quot;&quot;企业新闻口径&quot;&quot;二手来源&quot;的内容，在本文件中&lt;strong&gt;保持原标注&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;front matter 说明&lt;/strong&gt;：周报使用 &lt;code&gt;tags: [&quot;AI每周总结&quot;]&lt;/code&gt; 与 &lt;code&gt;category: &quot;AI每周总结&quot;&lt;/code&gt;。若站点分类体系（taxonomy）需要与日报保持同一 category，请把 &lt;code&gt;category&lt;/code&gt; 改为 &lt;code&gt;&quot;AI每日总结&quot;&lt;/code&gt;，其余字段不变。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只读优先&lt;/strong&gt;：本文件生成过程未执行任何写入以外的操作，未提交、未删除、未覆盖任何既有文件。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AI 提示词</title><link>https://tuoyuangui.github.io/website/posts/typora/ai%E5%B7%A5%E5%85%B7/ai%E6%8F%90%E7%A4%BA%E8%AF%8D/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/ai%E5%B7%A5%E5%85%B7/ai%E6%8F%90%E7%A4%BA%E8%AF%8D/</guid><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AI 提示词&lt;/h1&gt;
&lt;h3&gt;1、每日定时任务提示词&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;你是资深地球物理方向的学者，熟悉 AI/深度学习、HPC、地震数据处理、全波形反演 FWI。

今天是 {{date}}，格式 YYYY-MM-DD。

任务：检索 {{lookback_days}} 天内 AI + 地球物理相关或者传统方法进展，筛选 10 条最相关内容；其中传统地球物理方法约 4 条（建议 3–5 条），AI/深度学习 + 地球物理约 6 条（建议 5–7 条）。若可验证的传统方法不足约 4 条，则按实际可验证条数列出并说明原因，不凑数。

读取 {{history_dir}} 中最近 {{lookback_reports}} 份历史总结，对比重复、升级、新增方向；分别对比 AI/地球物理与传统方法的重复、升级、新增方向，并在条目中标注“AI/地球物理”或“传统方法”。

严格要求：

只依据可验证来源，不编造链接、作者、团队、结论、数据或代码。

若信息不足或无法验证，标注“未验证/需人工确认”，不要凑数。

若不足 10 条，列出实际条数并说明原因；传统方法不足约 4 条时同样说明。

传统方法定义：以物理/数学/数值/信号处理/反演/成像/层析/地震干涉/走时/振幅等为核心，不以深度学习/机器学习为主要创新；AI 仅作辅助、对比或后处理的，归为传统方法。

AI/地球物理定义：以深度学习、机器学习、神经网络、基础模型、生成模型、强化学习等为核心创新的地球物理研究。

输出必须是一个完整 Markdown 文件全文，第一行必须是 YAML front matter，前面不要添加任何解释。

文件名：AI每周总结_{{date}}.md

YAML front matter 固定为：

title: &quot;AI每周总结-地球物理 ({{date}})&quot;
published: {{date}}
tags: [&quot;AI每周总结&quot;]
category: &quot;AI每周总结&quot;
draft: false

正文要求：

每条包含：标题、作者/团队、链接、方法、数据、代码、类别（AI/地球物理 或 传统方法）、对 {{project}} 的启发、验证状态。

按相关性排序；在整体排序中保留传统方法约 4 条、AI/地球物理约 6 条；若实际分布偏离，注明原因。

最后给出：今日趋势总结（分别总结 AI/地球物理与传统方法）、对 {{project}} 的行动建议、未解决项/需人工确认、检索说明（含两类条数分布、历史重复/升级/新增、不足原因）。

若平台支持写文件，将内容写入 AI每日总结_{{date}}.md；若不支持，只输出文件全文。

只读优先；涉及提交作业、删除、覆盖模型等操作，只给命令草稿，等待人工确认
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>deepseek harness 安装和使用</title><link>https://tuoyuangui.github.io/website/posts/typora/ai%E5%B7%A5%E5%85%B7/deepseek-harness-%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/ai%E5%B7%A5%E5%85%B7/deepseek-harness-%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8/</guid><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;deepseek harness 安装和使用&lt;/h1&gt;
&lt;h2&gt;方法一：直接使用node.js 安装&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#下载位置：https://nodejs.org/en/download
# 需要已安装好node.js node -v

# 直接安装
npx @deepseek-ai/dsh web

# 编译安装
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build # 准备仓库产物
pnpm dsh web   # 直接使用这些已构建产物
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在浏览器中打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./deepseek%20harness%20%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.assets/image-20260914163459533.png&quot; alt=&quot;image-20260914163459533&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入API密钥&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./deepseek%20harness%20%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.assets/image-20260914164038532.png&quot; alt=&quot;image-20260914164038532&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;方法二：在vscode中使用并自动安装（在remote ssh远程时工作存在问题）&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./deepseek%20harness%20%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.assets/image-20260914172313064.png&quot; alt=&quot;image-20260914172313064&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;方法三：使用dsh-tui 然后连接workbuddy 免费用token（推荐）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#下载位置：https://nodejs.org/en/download
# 需要已安装好node.js node -v

# 安装dsh 和 dsh-tui
# https://dshtui.com/getting-started/
npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui

# 安装workbuddy 按照官网教程即可
https://www.workbuddy.cn/events/invite?inviteCode=cdqfmscx2z

# 安装wrokbuddy-conect插件（选择版本）
# https://github.com/dingminhua/dsh-connect-workbuddy
dsh plugin --profile web add dsh-connect-workbuddy     # Web
dsh plugin --profile dsh-tui add dsh-connect-workbuddy # TUI
dsh plugin --profile desktop add dsh-connect-workbuddy # desktop

# 运行
dsh web # 网页
dsh-tui # TUI
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在vscode 的对应插件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./deepseek%20harness%20%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.assets/image-20260916165053686.png&quot; alt=&quot;image-20260916165053686&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在dsh-tui&lt;code&gt;/setting&lt;/code&gt;中修改各种设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./deepseek%20harness%20%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.assets/image-20260916165402885.png&quot; alt=&quot;image-20260916165402885&quot; /&gt;&lt;/p&gt;
&lt;p&gt;web 设置wrokbuddy&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 启动web页面并设置
dsh web
# 验证workbuddy状态
dsh plugin --profile web exec dsh-connect-workbuddy status
dsh plugin --profile dsh-tui exec dsh-connect-workbuddy status

#对于服务器，或者不详安装workbuddy 可以把已经登录workbuddy的信息粘贴
cp -r  其他位置的~/.local/share[~/.config]/CodeBuddyExtension   ~/./local/share/CodeBuddyExtension

# 输出示例
CN (domestic): signed in as 没脾气的鬼才
  Access token expires 2026-10-16T08:48:36.883Z (refresh is automatic)
  Local accounts: 1
  Remaining credit: 3552
Global: signed out
  Local accounts: 0
Host bundle: stale heartbeat (DSH process exited)
Client card: load failures are logged to the browser console only; the host providers are unaffected.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./deepseek%20harness%20%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.assets/image-20260916165950434.png&quot; alt=&quot;image-20260916165950434&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./deepseek%20harness%20%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.assets/image-20260916165921468.png&quot; alt=&quot;image-20260916165921468&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在tui中设置&lt;code&gt;/models&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./deepseek%20harness%20%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8.assets/image-20260916170344923.png&quot; alt=&quot;image-20260916170344923&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;总的命令&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 网络设置
export all_proxy=http://127.0.0.1:7890
# 删除老的包
rm -rf ~/.dsh ~/.npm ~/.dsh-tui ~/.nvm ~/.dsh-debug
# 下载并安装 nvm：
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# 代替重启 shell
\. &quot;$HOME/.nvm/nvm.sh&quot;
# 下载并安装 Node.js：
nvm install 24
# 验证 Node.js 版本：
node -v # Should print &quot;v24.21.0&quot;.
# 下载并安装 pnpm：
corepack enable pnpm
# 验证 pnpm 版本：
pnpm -v
# 安装 deepseek harness 以及tui
npm install -g @deepseek-ai/dsh@0.2.0-rc.2 @deepseek-harness-tui/dsh-tui@0.14.0
dsh --version
dsh-tui --version
# 验证 
dsh plugin --profile web     add dsh-connect-workbuddy@4.3.2
dsh plugin --profile dsh-tui add dsh-connect-workbuddy@4.3.2
dsh plugin --profile web     exec dsh-connect-workbuddy status
dsh plugin --profile dsh-tui exec dsh-connect-workbuddy status

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>利用公开模板建站</title><link>https://tuoyuangui.github.io/website/posts/typora/%E7%BD%91%E7%BB%9C%E5%BB%BA%E7%AB%99/%E5%88%A9%E7%94%A8%E5%85%AC%E5%BC%80%E6%A8%A1%E6%9D%BF%E5%BB%BA%E7%AB%99/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E7%BD%91%E7%BB%9C%E5%BB%BA%E7%AB%99/%E5%88%A9%E7%94%A8%E5%85%AC%E5%BC%80%E6%A8%A1%E6%9D%BF%E5%BB%BA%E7%AB%99/</guid><pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1、安装node.js&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 下载并安装 nvm：
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# 代替重启 shell
\. &quot;$HOME/.nvm/nvm.sh&quot;

# 下载并安装 Node.js：
nvm install 24


corepack enable
corepack prepare pnpm@11 --activate

# 验证 Node.js 版本：
node -v # Should print &quot;v24.21.0&quot;.

# 验证 npm 版本：
npm -v # Should print &quot;11.19.0&quot;.

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、安装包和运行&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# https://github.com/saicaca/fuwari
pnpm install
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;参考来源&lt;/h3&gt;
&lt;p&gt;https://bysansheng.cn/posts/fuwari-%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/&lt;/p&gt;
&lt;p&gt;https://fuwari.vercel.app/&lt;/p&gt;
&lt;p&gt;https://github.com/afoim/fuwari&lt;/p&gt;
&lt;p&gt;https://blog.isyyo.com/posts/fuwari_tutorial/&lt;/p&gt;
</content:encoded></item><item><title>Linux 服务器本地转发</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%90%86%E8%BD%AC%E5%8F%91/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%90%86%E8%BD%AC%E5%8F%91/</guid><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Linux 服务器本地转发&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 查看本地端口情况
ss -tlnp | grep 1080

#pkill -9 -u liguolong

# 在 WSL 中执行 - 创建 SOCKS5 服务
ssh -fN -D 1080 localhost

# 在 WSL 中测试代理是否工作
curl --socks5-hostname localhost:1080 https://www.baidu.com -I

# 在 WSL 中执行 - 将 SOCKS5 服务转发到远端
ssh -fN -R 1080:localhost:1080 liguolong@172.19.133.164

# SSH 登录远端后执行
curl --socks5-hostname localhost:1080 https://www.baidu.com -I

#代理解析
export http_proxy=&quot;socks5h://localhost:1080&quot;
export https_proxy=&quot;socks5h://localhost:1080&quot;
export all_proxy=&quot;socks5h://localhost:1080&quot;

# 本地解析 DNS（需要本地能解析域名）
export http_proxy=&quot;socks5://localhost:1080&quot;
export https_proxy=&quot;socks5://localhost:1080&quot;

ssh -fN -D 1080 localhost
ssh -fN -R 1080:localhost:1080 lyy-node3
ssh lyy-node3
export http_proxy=&quot;socks5h://localhost:1080&quot;
export https_proxy=&quot;socks5h://localhost:1080&quot;
export all_proxy=&quot;socks5h://localhost:1080&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;本地端口&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./Linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%90%86%E8%BD%AC%E5%8F%91.assets/image-20260514212140002.png&quot; alt=&quot;image-20260514212140002&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;服务器端口&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./Linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%90%86%E8%BD%AC%E5%8F%91.assets/image-20260514212302039.png&quot; alt=&quot;image-20260514212302039&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>VScode调试 CUDA+CMAKE</title><link>https://tuoyuangui.github.io/website/posts/typora/%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95/vscode%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95/vscode%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95/</guid><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;VScode调试 CUDA+CMAKE&lt;/h1&gt;
&lt;p&gt;在vscode中进行运行调试cuda程序&lt;/p&gt;
&lt;h2&gt;Launch.json&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;version&quot;: &quot;0.2.0&quot;,
  &quot;configurations&quot;: [
    {
      &quot;name&quot;: &quot;CUDA C++: Launch&quot;,
      &quot;type&quot;: &quot;cuda-gdb&quot;,
      &quot;request&quot;: &quot;launch&quot;,
      &quot;program&quot;: &quot;${workspaceFolder}/build/gpu2dfd&quot;,
      &quot;args&quot;: &quot;xx&quot;,
      &quot;preLaunchTask&quot;:&quot;Build&quot;
    },
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Tasks.json&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;version&quot;: &quot;2.0.0&quot;,
  &quot;options&quot;: {
  &quot;cwd&quot;: &quot;${workspaceFolder}/build&quot; // 进入 build 文件夹
  },
  &quot;tasks&quot;: [
    {
     // 运行 cmake .. 命令
      &quot;type&quot;: &quot;shell&quot;,
      &quot;label&quot;: &quot;cmake&quot;,
      &quot;command&quot;: &quot;cmake&quot;,
      &quot;args&quot;: [
        &quot;..&quot;
      ]
    },
    {
      // 运行 make 命令
      &quot;label&quot;: &quot;make&quot;,
      &quot;group&quot;: {
        &quot;kind&quot;: &quot;build&quot;,
        &quot;isDefault&quot;: true
     },
      &quot;command&quot;: &quot;make&quot;,
      &quot;args&quot;: [
      ]
    },
    {
      &quot;label&quot;: &quot;Build&quot;,
     &quot;dependsOrder&quot;: &quot;sequence&quot;, // 按列出的顺序执行任务依赖项
      &quot;dependsOn&quot;:[
        &quot;cmake&quot;,
        &quot;make&quot;
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cmake&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# complie the FDTD CUDA code with cmake
cmake_minimum_required(VERSION 3.10)
project(GPU2DFD LANGUAGES CUDA CXX)

# set the debug mode
set(CMAKE_BUILD_TYPE Debug)

# check the cuda language
include(CheckLanguage)
check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
  message(STATUS &quot;Find CUDA !&quot;)
else()
  message(FATAL_ERROR &quot;Not found CUDA!&quot;)
endif()
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_CUDA_ARCHITECTURES 50 60 70)
# add the source file
add_executable(gpu2dfd gpu2dfd.cu)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>podman 换源与示例</title><link>https://tuoyuangui.github.io/website/posts/typora/docker%E5%92%8Cpodman/podman%E6%8D%A2%E6%BA%90%E4%B8%8E%E7%A4%BA%E4%BE%8B/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/docker%E5%92%8Cpodman/podman%E6%8D%A2%E6%BA%90%E4%B8%8E%E7%A4%BA%E4%BE%8B/</guid><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;podman 换源与示例&lt;/h1&gt;
&lt;h2&gt;一、docker国内源&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo cp  /etc/containers/registries.conf /etc/containers/registries.conf.bak
$ sudo vim /etc/containers/registries.conf

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;在末尾添加&lt;/strong&gt; 配置文件也可以&lt;code&gt;/home/lgl/.config/containers/storage.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./podman%E6%8D%A2%E6%BA%90%E4%B8%8E%E7%A4%BA%E4%BE%8B.assets/image-20240628235827635.png&quot; alt=&quot;image-20240628235827635&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[registry]]
# 需要被加速的原始仓库
prefix = &quot;docker.io&quot;
# 实际访问的仓库地址，通常与 prefix 相同
location = &quot;docker.io&quot;

# 第一个镜像源：中科大（推荐）
[[registry.mirror]]
location = &quot;3uscr8bc.mirror.aliyuncs.com&quot;
# 是否允许不安全的HTTP连接，国内主流源都支持HTTPS，保持false即可
insecure = false
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$ sudo systemctl restart podman
$ podman info #检查是否成功
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./podman%E6%8D%A2%E6%BA%90%E4%B8%8E%E7%A4%BA%E4%BE%8B.assets/image-20240629001751904.png&quot; alt=&quot;image-20240629001751904&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;二、检查是否成功&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ podman pull hello-world
$ podman run hello-world
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./podman%E6%8D%A2%E6%BA%90%E4%B8%8E%E7%A4%BA%E4%BE%8B.assets/image-20240629004552295.png&quot; alt=&quot;image-20240629004552295&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;三、删除镜像和容器&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 删除容器
podman rm -af
# 删除所有镜像（谨慎使用！）
podman rmi -af

#进入容器的交互式终端
podman exec -it container_name /bin/bash

#列出当前正在运行的容器
podman ps

#列出所有容器（包括已停止的容器）
podman ps -a

#停止一个或多个容器
podman stop container_name
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>makefile： 管理项目基本用法</title><link>https://tuoyuangui.github.io/website/posts/typora/%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95/makefile%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95/makefile%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95/</guid><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;makefile： 管理项目基本用法&lt;/h1&gt;
&lt;h2&gt;1、 基本介绍&lt;/h2&gt;
&lt;p&gt;使用 GCC 的命令行进行程序编译在单个文件下是比较方便的，当工程中的文件逐渐增多，甚至变得十分庞大的时候，使用 GCC 命令编译就会变得力不从心。这种情况下我们需要借助项目构造工具 make 帮助我们完成这个艰巨的任务。 make是一个命令工具，是一个解释makefile中指令的命令工具。&lt;/p&gt;
&lt;p&gt;make工具在构造项目的时候需要加载一个叫做makefile的文件，makefile关系到了整个工程的编译规则。一个工程中的源文件不计数，其按类型、功能、模块分别放在若干个目录中，makefile定义了一系列的规则来指定哪些文件需要先编译，哪些文件需要后编译，哪些文件需要重新编译，甚至于进行更复杂的功能操作，因为makefile就像一个Shell脚本一样，其中也可以执行操作系统的命令。&lt;/p&gt;
&lt;p&gt;makefile带来的好处就是——“自动化编译”，一旦写好，只需要一个make命令，整个工程完全自动编译，极大的提高了软件开发的效率。makefile文件有两种命名方式 makefile 和 Makefile，构建项目的时候在哪个目录下执行构建命令 make这个目录下的 makefile 文件就会别加载，因此在一个项目中可以有多个 makefile 文件，分别位于不同的项目目录中。&lt;/p&gt;
&lt;h2&gt;2、基本用法&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;命名：&lt;/strong&gt;&lt;code&gt;makefile&lt;/code&gt;	&lt;code&gt;Makefile&lt;/code&gt;   (make) 命令&lt;/p&gt;
&lt;p&gt;**1 个规则：**依赖条件（一个tab缩进）命令&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;目标的时间必须晚于依赖条件的时间，否则，更新目标&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依赖条件如果不存在，找寻新的规则去产生依赖条件。
&lt;strong&gt;ALL：指定 makefile 的终极目标。否则终极目标是第一个目标&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;2 个函数：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src = $(wildcard ./*.c): 匹配当前工作目录下的所有.c 文件。将文件名组成列表，赋值给变量 src。
src = add.c sub.c div1.c

obj = $(patsubst %.c, %.o, $(src)): 将参数3中，包含参数1的部分，替换为参数2。
obj = add.o sub.o div1.o

clean:	(没有依赖)
    -rm -rf $(obj) a.out    “-”：作用是，删除不存在文件时，不报错。顺序执行结束。
    make clean -n  模拟执行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3 个自动变量：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$@: 在规则的命令中，表示规则中的目标。

$^: 在规则的命令中，表示所有依赖条件。

$&amp;lt;: 在规则的命令中，表示第一个依赖条件。
如果将该变量应用在模式规则中，它可将依赖条件列表中的依赖依次取出，套用模式规则。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;模式规则：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%.o:%.c
   gcc -c $&amp;lt; -o $@
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**静态模式规则：**大目标是obj，这个obj就是各种.o文件，然后%.o就是具体的解释，而%.c就是对应同样名字的.c文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(obj):%.o:%.c
   gcc -c $&amp;lt; -o $@
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**伪目标：**告诉make，.PHONY：后面跟着的名称不是指文件名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.PHONY: clean ALL

参数：
    -n：模拟执行make、make clean 命令。

    -f：指定文件执行 make 命令。                xxxx.mk
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、详细用法&lt;/h2&gt;
&lt;h3&gt;3.1.、规则&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Makefile的框架是由规则构成的。make命令执行时先在Makefile文件中查找各种规则，对各种规则进行解析后运行规则。规则的基本格式为：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;target1,target2...: depend1, depend2, ...
    command
    ......
    ......
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每条规则由三个部分组成分别是&lt;code&gt;目标(target)&lt;/code&gt;, &lt;code&gt;依赖(depend)&lt;/code&gt;和&lt;code&gt;命令(command)&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;命令(command)&lt;/code&gt;: 当前这条规则的动作，一般情况下这个动作就是一个 shell 命令&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如：通过某个命令编译文件、生成库文件、进入目录等。&lt;/li&gt;
&lt;li&gt;动作可以是多个，&lt;code&gt;每个命令前必须有一个Tab缩进并且独占占一行&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;依赖(depend)&lt;/code&gt;: 规则所必需的依赖条件，在规则的命令中可以使用这些依赖。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如：生成可执行文件的目标文件（&lt;code&gt;*.o&lt;/code&gt;）可以作为依赖使用&lt;/li&gt;
&lt;li&gt;如果规则的命令中不需要任何依赖，那么规则的依赖可以为空&lt;/li&gt;
&lt;li&gt;当前规则中的依赖可以是其他规则中的某个目标，这样就形成了规则之间的嵌套&lt;/li&gt;
&lt;li&gt;依赖可以根据要执行的命令的实际需求, 指定很多个&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;目标(target)&lt;/code&gt;： 规则中的目标，这个目标和规则中的命令是对应的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过执行规则中的命令，可以生成一个和目标同名的文件&lt;/li&gt;
&lt;li&gt;规则中可以有多个命令, 因此可以通过这多条命令来生成多个目标, 所有目标也可以有很多个&lt;/li&gt;
&lt;li&gt;通过执行规则中的命令，可以只执行一个动作，不生成任何文件，这样的目标被称为&lt;code&gt;伪目标&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2、 工作原理&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;在此主要为大家剖析一下通过提供的 makefile 文件，构建工具 make 什么时候编译项目中的所有文件, 什么时候只选择更新项目中的某几个文件。另外再研究一下如果makefile里边有多个规则它们之间是如何配合工作的，我们基于下边的例子，依次进行讲解。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;make 命令执行的时候会根据文件的时间戳判定是否执行makefile文件中相关规则中的命令。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标是通过依赖生成的，因此&lt;code&gt;正常情况下：目标时间戳 &amp;gt; 所有依赖的时间戳&lt;/code&gt;, 如果执行 make 命令的时候检测到规则中的目标和依赖满足这个条件, 那么规则中的命令就不会被执行。&lt;/li&gt;
&lt;li&gt;当依赖文件被更新了, 文件时间戳也会随之被更新, 这时候 &lt;code&gt;目标时间戳 &amp;lt; 某些依赖的时间戳&lt;/code&gt;, 在这种情况下目标文件会通过规则中的命令被重新生成。&lt;/li&gt;
&lt;li&gt;如果规则中的目标对应的文件根本就不存在， 那么规则中的命令肯定会被执行。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3、自动推导&lt;/h3&gt;
&lt;p&gt;make 是一个功能强大的构建工具，虽然make需要根据 makefile 中指定的规则来完成源文件的编译。作为小白的我们编写makefile的时候难免写的不是那么严谨从而漏写一些构建规则，但是我们会发现程序还是会被编译成功。这是因为 make 有自动推导的能力，不会完全依赖 makefile。&lt;/p&gt;
&lt;p&gt;比如: 使用命令 make 编译扩展名为.c 的 C 语言文件的时候，源文件的编译规则不用明确给出。这是因为 make 进行编译的时候会使用一个默认的编译规则，按照默认规则完成对.c文件的编译，生成对应的.o 文件。它使用命令&lt;code&gt;cc -c&lt;/code&gt;来编译.c 源文件。在 Makefile 中只要给出需要构建的目标文件名（一个.o 文件），make 会自动为这个.o 文件寻找合适的依赖文件（对应的.c 文件），并且使用默认的命令来构建这个目标文件。&lt;/p&gt;
&lt;p&gt;假设本地项目目录中有以下几个源文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tree
.
├── add.c
├── div.c
├── head.h
├── main.c
├── makefile
├── mult.c
└── sub.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目录中 makefile 文件内容如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;calc:add.o  div.o  main.o  mult.o  sub.o
       gcc  add.o  div.o  main.o  mult.o  sub.o -o calc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过make构建项目:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ make
cc    -c -o add.o add.c
cc    -c -o div.o div.c
cc    -c -o main.o main.c
cc    -c -o mult.o mult.c
cc    -c -o sub.o sub.c
gcc  add.o  div.o  main.o  mult.o  sub.o -o calc
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;我们可以发现上边的 makefile 文件中只有一条规则, 依赖中所有的 &lt;code&gt;.o&lt;/code&gt;文件在本地项目目录中是不存在的, 并且也没有其他的规则用来生成这些依赖文件, 这时候 make 会使用内部默认的构造规则先将这些依赖文件生成出来, 然后在执行规则中的命令, 最后生成目标文件 calc。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.4、 变量&lt;/h3&gt;
&lt;p&gt;使用 Makefile 进行规则定义的时候，为了写起来更加灵活，我们可以在里边使用变量。makefile中的变量分为三种：&lt;code&gt;自定义变量&lt;/code&gt;，&lt;code&gt;预定义变量&lt;/code&gt;和&lt;code&gt;自动变量&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;自定义变量&lt;/strong&gt;用 Makefile 进行规则定义的时候，用户可以定义自己的变量，称为用户自定义变量。makefile 中的变量是没有类型的，直接创建变量然后给其赋值就可以了。&lt;/p&gt;
&lt;p&gt;变量名=变量值&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;预定义变量&lt;/strong&gt; 在 Makefile 中有一些已经定义的变量，用户可以直接使用这些变量，不用进行定义。在进行编译的时候，某些条件下 Makefile 会使用这些预定义变量的值进行编译。这些预定义变量的名字一般都是大写的，经常采用的预定义变量如下表所示：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变 量 名&lt;/th&gt;
&lt;th&gt;含 义&lt;/th&gt;
&lt;th&gt;默 认 值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AR&lt;/td&gt;
&lt;td&gt;生成静态库库文件的程序名称&lt;/td&gt;
&lt;td&gt;ar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AS&lt;/td&gt;
&lt;td&gt;汇编编译器的名称&lt;/td&gt;
&lt;td&gt;as&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC&lt;/td&gt;
&lt;td&gt;C 语言编译器的名称&lt;/td&gt;
&lt;td&gt;cc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPP&lt;/td&gt;
&lt;td&gt;C 语言预编译器的名称&lt;/td&gt;
&lt;td&gt;$(CC) -E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CXX&lt;/td&gt;
&lt;td&gt;C++语言编译器的名称&lt;/td&gt;
&lt;td&gt;g++&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FC&lt;/td&gt;
&lt;td&gt;FORTRAN 语言编译器的名称&lt;/td&gt;
&lt;td&gt;f77&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RM&lt;/td&gt;
&lt;td&gt;删除文件程序的名称&lt;/td&gt;
&lt;td&gt;rm -f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARFLAGS&lt;/td&gt;
&lt;td&gt;生成静态库库文件程序的选项&lt;/td&gt;
&lt;td&gt;无默认值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASFLAGS&lt;/td&gt;
&lt;td&gt;汇编语言编译器的编译选项&lt;/td&gt;
&lt;td&gt;无默认值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CFLAGS&lt;/td&gt;
&lt;td&gt;C 语言编译器的编译选项&lt;/td&gt;
&lt;td&gt;无默认值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPPFLAGS&lt;/td&gt;
&lt;td&gt;C 语言预编译的编译选项&lt;/td&gt;
&lt;td&gt;无默认值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CXXFLAGS&lt;/td&gt;
&lt;td&gt;C++语言编译器的编译选项&lt;/td&gt;
&lt;td&gt;无默认值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FFLAGS&lt;/td&gt;
&lt;td&gt;FORTRAN 语言编译器的编译选项&lt;/td&gt;
&lt;td&gt;无默认&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;自动变量&lt;/strong&gt;：Makefile 中的变量除了用户自定义变量和预定义变量外，还有一类自动变量。Makefile 中的规则语句中经常会出现目标文件和依赖文件，&lt;code&gt;自动变量用来代表这些规则中的目标文件和依赖文件，并且它们只能在规则的命令中使用。&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;下表中是一些常见的自动变量。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变 量&lt;/th&gt;
&lt;th&gt;含 义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$*&lt;/td&gt;
&lt;td&gt;表示目标文件的名称，不包含目标文件的扩展名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$+&lt;/td&gt;
&lt;td&gt;表示所有的依赖文件，这些依赖文件之间以空格分开，按照出现的先后为顺序，其中可能 包含重复的依赖文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$&amp;lt;&lt;/td&gt;
&lt;td&gt;表示依赖项中第一个依赖文件的名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$?&lt;/td&gt;
&lt;td&gt;依赖项中，所有比目标文件时间戳晚的依赖文件，依赖文件之间以空格分开&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$@&lt;/td&gt;
&lt;td&gt;表示目标文件的名称，包含文件扩展名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$^&lt;/td&gt;
&lt;td&gt;依赖项中，所有不重复的依赖文件，这些文件之间以空格分开&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;3.5、 模式匹配&lt;/h3&gt;
&lt;p&gt;在介绍概念之前, 先读一下下面的这个 makefile 文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;calc:add.o  div.o  main.o  mult.o  sub.o
        gcc  add.o  div.o  main.o  mult.o  sub.o -o calc

add.o:add.c
        gcc add.c -c

div.o:div.c
        gcc div.c -c

main.o:main.c
        gcc main.c -c

sub.o:sub.c
        gcc sub.c -c

mult.o:mult.c
        gcc mult.c -c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在阅读过程中能够发现从第二个规则开始到第六个规则做的是相同的事情, 但是由于文件名不同不得不在文件中写出多个规则，这就让 makefile 文件看起来非常的冗余，我们可以将这一系列的相同操作整理成一个模板，所有类似的操作都通过模板去匹配 makefile 会因此而精简不少，只是可读性会有所下降。&lt;/p&gt;
&lt;p&gt;这个规则模板可以写成下边的样子，这种操作就称之为模式匹配。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%.o:%.c	gcc $&amp;lt; -c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./Makefile%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95.assets/image-20200418143747981-1611845766993.png&quot; alt=&quot;Image 1: image-20200418143747981&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.6、函数&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;makefile中有很多函数并且&lt;code&gt;所有的函数都是有返回值的。&lt;/code&gt;makefile中函数的格式和C/C++中函数也不同，其写法是这样的： &lt;code&gt;$(函数名 参数1, 参数2, 参数3, ...)&lt;/code&gt;，主要目的是让我们能够快速方便的得到函数的返回值。&lt;/p&gt;
&lt;p&gt;这里为大家介绍两个 makefile 中使用频率比较高的函数：&lt;code&gt;wildcard&lt;/code&gt;和&lt;code&gt;patsubst&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;wildcard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个函数的主要作用是获取指定目录下指定类型的文件名，其返回值是以空格分割的、指定目录下的所有符合条件的文件名列表。函数原型如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(wildcard PATTERN...)
    参数:    指定某个目录, 搜索这个路径下指定类型的文件，比如： *.c
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;参数功能:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PATTERN 指的是某个或多个目录下的对应的某种类型的文件, 比如&lt;code&gt;当前目录下的.c&lt;/code&gt;文件可以写成 &lt;code&gt;*.c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以指定多个目录，每个路径之间使用空格间隔&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;得到的若干个文件的文件列表， 文件名之间使用空格间隔&lt;/li&gt;
&lt;li&gt;示例：&lt;code&gt;$(wildcard *.c ./sub/*.c)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;返回值格式: a.c b.c c.c d.c e.c f.c ./sub/aa.c ./sub/bb.c&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;patsubst&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个函数的功能是按照指定的模式替换指定的文件名的后缀, 函数原型如下:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(patsubst &amp;lt;pattern&amp;gt;,&amp;lt;replacement&amp;gt;,&amp;lt;text&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;参数功能:
&lt;ul&gt;
&lt;li&gt;pattern: 这是一个模式字符串, 需要指定出要被替换的文件名中的后缀是什么
&lt;ul&gt;
&lt;li&gt;文件名和路径不需要关心, 因此使用 % 表示即可 [通配符是 %]&lt;/li&gt;
&lt;li&gt;在通配符后边指定出要被替换的后缀, 比如: %.c, 意味着 .c的后缀要被替换掉&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;replacement: 这是一个模式字符串, 指定参数pattern中的后缀最终要被替换为什么
&lt;ul&gt;
&lt;li&gt;还是使用 % 来表示参数pattern 中文件的路径和名字&lt;/li&gt;
&lt;li&gt;在通配符 % 后边指定出新的后缀名, 比如: %.o 这表示原来的后缀被替换为 .o&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;text: 该参数中存储这要被替换的原始数据&lt;/li&gt;
&lt;li&gt;返回值:
&lt;ul&gt;
&lt;li&gt;函数返回被替换过后的字符串。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reference：&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://subingwen.cn/linux/makefile/?highlight=make&quot;&gt;Makefile | 爱编程的大丙 (subingwen.cn)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>PyQT 软件安装</title><link>https://tuoyuangui.github.io/website/posts/typora/gui%E5%B7%A5%E5%85%B7/pyqt%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gui%E5%B7%A5%E5%85%B7/pyqt%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/</guid><pubDate>Fri, 12 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;PyQT 软件安装&lt;/h1&gt;
&lt;h2&gt;一、环境配置&lt;/h2&gt;
&lt;h3&gt;1、基础环境&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ pip install pyqt6
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2、Qt creater&lt;/h3&gt;
&lt;p&gt;https://mirrors.tuna.tsinghua.edu.cn/
&lt;img src=&quot;./PyQT%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85.assets/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6X5LiA55m-5LqM5Y2B5YWr,size_20,color_FFFFFF,t_70,g_se,x_16.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2、搜索QT&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./PyQT%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85.assets/4618845b3f474ff886d291c43661e79b.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3、打开[archive]&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./PyQT%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85.assets/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6X5LiA55m-5LqM5Y2B5YWr,size_20,color_FFFFFF,t_70,g_se,x_16-1719458766195-1.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3、打开[online_installers]&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./PyQT%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85.assets/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6X5LiA55m-5LqM5Y2B5YWr,size_20,color_FFFFFF,t_70,g_se,x_16-1719458766195-2.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;4、选择最新版&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./PyQT%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85.assets/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6X5LiA55m-5LqM5Y2B5YWr,size_20,color_FFFFFF,t_70,g_se,x_16-1719458766195-3.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;5、选择linux下的最新版&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./PyQT%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85.assets/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p6X5LiA55m-5LqM5Y2B5YWr,size_20,color_FFFFFF,t_70,g_se,x_16-1719458766195-4.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;6、下载安装&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./PyQT%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85.assets/image-20240627112714872.png&quot; alt=&quot;image-20240627112714872&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://blog.csdn.net/qq_53873381/article/details/129876234&quot;&gt;Qt安装教程以及QT Creater，同时使用清华源镜像，解决安装过慢的问题_qt清华镜像-CSDN博客&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>ASCII输出光标和颜色</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/ascii%E6%8E%A7%E5%88%B6%E8%BE%93%E5%87%BA%E5%85%89%E6%A0%87%E5%92%8C%E9%A2%9C%E8%89%B2/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/ascii%E6%8E%A7%E5%88%B6%E8%BE%93%E5%87%BA%E5%85%89%E6%A0%87%E5%92%8C%E9%A2%9C%E8%89%B2/</guid><pubDate>Fri, 12 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;ASCII输出光标和颜色&lt;/h1&gt;
&lt;h2&gt;ASCII 控制字符 - &quot;\033&quot;&lt;/h2&gt;
&lt;p&gt;ASCII控制字符的编号范围是0-31和127（0x00-0x1F和0x7F），共33个字符。&lt;/p&gt;
&lt;p&gt;输出到控制台时，可以利用控制字符来控制输出文本的显示效果。&lt;/p&gt;
&lt;p&gt;控制字符可以用8进制或16进制表示，比如：&lt;code&gt;&quot;\033&quot;, &quot;\0x1b&quot;, &quot;\x1b&quot;&lt;/code&gt;均表示同一个控制字符，含义是ESC&lt;/p&gt;
&lt;p&gt;ESC后面跟一个格式字符串，用来设置颜色或控制光标&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;格式&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;含义&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;\033[0m&lt;/td&gt;
&lt;td&gt;关闭所有属性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[1m&lt;/td&gt;
&lt;td&gt;设置高亮度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[4m&lt;/td&gt;
&lt;td&gt;下划线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[5m&lt;/td&gt;
&lt;td&gt;闪烁&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[7m&lt;/td&gt;
&lt;td&gt;反显&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[8m&lt;/td&gt;
&lt;td&gt;消隐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[30~37m&lt;/td&gt;
&lt;td&gt;设置前景色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[40~47;m&lt;/td&gt;
&lt;td&gt;设置背景色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[nA&lt;/td&gt;
&lt;td&gt;光标上移n行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[nB&lt;/td&gt;
&lt;td&gt;光标下移n行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[nC&lt;/td&gt;
&lt;td&gt;光标右移n行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[nD&lt;/td&gt;
&lt;td&gt;光标左移n行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[y;xH&lt;/td&gt;
&lt;td&gt;设置光标位置  printf(&quot;\033[%d;%dH&quot;,  (x), (y))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[2J&lt;/td&gt;
&lt;td&gt;清屏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[K&lt;/td&gt;
&lt;td&gt;清除从光标到行尾的内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[s&lt;/td&gt;
&lt;td&gt;保存光标位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[u&lt;/td&gt;
&lt;td&gt;恢复光标位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[?25l&lt;/td&gt;
&lt;td&gt;隐藏光标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\033[?25h&lt;/td&gt;
&lt;td&gt;显示光标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;显示光标&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前景色和背景色对应的数字&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;颜色&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;背景色&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;背景色加亮&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;前景色&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;前景色加亮&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;黑&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;红&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;绿&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;黄&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;蓝&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;紫&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靛蓝&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;白&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;使用echo命令进行测试&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以使用echo命令对格式字符串进行测试&lt;/p&gt;
&lt;p&gt;例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo -e &quot;\033[41;36m 一段文字 \033[0m&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里先把控制台的背景色设置为红色（41），文字的颜色设置为靛蓝色（36），打印一段文字后，关闭了所有设置（还原到默认状态下）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./ASCII%E6%8E%A7%E5%88%B6%E8%BE%93%E5%87%BA%E5%85%89%E6%A0%87%E5%92%8C%E9%A2%9C%E8%89%B2.assets/clip_image001.png&quot; alt=&quot;output&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;测试不同的前景色&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./ASCII%E6%8E%A7%E5%88%B6%E8%BE%93%E5%87%BA%E5%85%89%E6%A0%87%E5%92%8C%E9%A2%9C%E8%89%B2.assets/clip_image002.png&quot; alt=&quot;test-foregroud-color&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;C语言控制颜色和输出&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
// 清除屏幕
#define CLEAR() printf(&quot;\033[2J&quot;)
// 上移光标
#define MOVEUP(x) printf(&quot;\033[%dA&quot;, (x))
// 下移光标
#define MOVEDOWN(x) printf(&quot;\033[%dB&quot;, (x))
// 左移光标
#define MOVELEFT(y) printf(&quot;\033[%dD&quot;, (y))
// 右移光标
#define MOVERIGHT(y) printf(&quot;\033[%dC&quot;,(y))
// 定位光标
#define MOVETO(x,y) printf(&quot;\033[%d;%dH&quot;, (x), (y))
// 光标复位
#define RESET_CURSOR() printf(&quot;\033[H&quot;)
// 隐藏光标
#define HIDE_CURSOR() printf(&quot;\033[?25l&quot;)
// 显示光标
#define SHOW_CURSOR() printf(&quot;\033[?25h&quot;)
//反显
#define HIGHT_LIGHT() printf(&quot;\033[7m&quot;)
#define UN_HIGHT_LIGHT() printf(&quot;\033[27m&quot;)
int main(int argc,char **argv)
{
    // 颜色
    printf(&quot;\033[31mThe color,%s!\033[1m\n&quot;,&quot;haha&quot;);
    printf(&quot;\033[31mThe color,%s!\033[4m\n&quot;,&quot;haha&quot;);
    printf(&quot;\033[31mThe color,%s!\033[5m\n&quot;,&quot;haha&quot;);
    printf(&quot;\033[31mThe color,%s!\033[7m\n&quot;,&quot;haha&quot;);
    printf(&quot;\033[31mThe color,%s!\033[8m\n&quot;,&quot;haha&quot;);
    printf(&quot;\033[31mThe color,%s!\033[0m\n&quot;,&quot;haha&quot;);
    printf(&quot;\033[47;31mThe color,%s!\033[0m\n&quot;,&quot;haha&quot;);
    printf(&quot;\033[47mThe color,%s!\033[0m\n&quot;,&quot;haha&quot;);
    // 光标
    sleep(2);
    printf(&quot;\033[47m%s!\033[5A\n&quot;,&quot;up 5&quot;);
    sleep(2);
    printf(&quot;\033[47m%s!\033[9B\n&quot;,&quot;down 9&quot;);
    sleep(2);
    printf(&quot;\033[47m%s!\033[19C\n&quot;,&quot;right 19&quot;);
    printf(&quot;right19&quot;);
    sleep(2);
    printf(&quot;\033[47m%s!\033[10D\n&quot;,&quot;left 10&quot;);
    printf(&quot;left 10&quot;);
    sleep(2);
    printf(&quot;\033[47m%s!\033[50;20H\n&quot;,&quot;move to y:50,x 20&quot;);
    printf(&quot;y50 x 20&quot;);
    sleep(2);
    printf(&quot;\033[47m%s!\033[?25l\n&quot;,&quot;hide cursor&quot;);
    sleep(2);
    printf(&quot;\033[47m%s!\033[?25h\n&quot;,&quot;sow cursor&quot;);
    sleep(2);
    printf(&quot;\033[47m%s!\033[2J\n&quot;,&quot;clear scleen&quot;);
    sleep(2);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】https://www.cnblogs.com/sunhaixian/p/16528087.html&lt;/p&gt;
&lt;p&gt;【2】https://blog.csdn.net/kevinshq/article/details/8179252&lt;/p&gt;
</content:encoded></item><item><title>导出依赖包</title><link>https://tuoyuangui.github.io/website/posts/typora/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E5%AF%BC%E5%87%BA%E4%BE%9D%E8%B5%96%E5%8C%85/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E5%AF%BC%E5%87%BA%E4%BE%9D%E8%B5%96%E5%8C%85/</guid><pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;导出依赖包&lt;/h1&gt;
&lt;h2&gt;1、导出虚拟环境中的包&lt;/h2&gt;
&lt;p&gt;导出pip已经安装的所有包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pip freeze &amp;gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面这种方式只适合在&lt;a href=&quot;https://so.csdn.net/so/search?q=%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83&amp;amp;spm=1001.2101.3001.7020&quot;&gt;虚拟环境&lt;/a&gt;中导出虚拟环境中的包，如果不是在虚拟环境下就会导出全局环境的python的环境包&lt;/p&gt;
&lt;h2&gt;2、导出项目依赖的包&lt;/h2&gt;
&lt;p&gt;当我们只想导出我们创建的项目的依赖包，而我们的项目又不在虚拟环境中，这样就会导出多余的包，&lt;/p&gt;
&lt;p&gt;要想在全局环境中导出我们项目的依赖包，可以利用python包&lt;code&gt;pipreqs&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pip install pipreqs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入到项目所在目录，在执行下面的命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pipreqs . --encoding=utf8 --force
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;# “.” 指的是将导出依赖包的文件放在当前目录下&lt;/p&gt;
&lt;p&gt;# “--encoding=utf8” 指的是存放文件的编码为utf-8,否则会报错&lt;/p&gt;
&lt;p&gt;# “--force” --force 强制执行，当 生成目录下的requirements.txt存在时强制覆盖&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>安装基础地震常用软件脚本</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/%E5%BF%AB%E9%80%9Fubuntu%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/%E5%BF%AB%E9%80%9Fubuntu%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/</guid><pubDate>Thu, 12 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安装基础地震常用软件脚本&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh
source ~/miniconda3/bin/activate
conda init --all
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --set show_channel_urls yes
pip install pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy scipy pandas matplotlib seaborn
pip install numpy pandas matplotlib
pip install scipy
pip install tqdm
pip install jupyter
pip install matplotlib
pip install scons
sudo apt install python3 python-is-python3 python3-dev python-dev-is-python3 python3-pip python3-numpy libxaw7-dev freeglut3-dev libnetpbm10-dev libgd-dev libplplot-dev libcairo2-dev libjpeg-dev swig g++ gfortran libopenmpi-dev libfftw3-dev libsuitesparse-dev git
sudo apt update
sudo apt install -y build-essential gfortran  libx11-dev libxt-dev libxaw7-dev     xorg-dev libmotif-dev libxmu-dev libxext-dev libpng-dev libjpeg-dev libgif-dev     libtiff-dev libfftw3-dev libblas-dev liblapack-dev ghostscript gv
sudo apt install x11-apps
sudo apt install libtirpc-dev
sudo apt-get install imagemagick
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;安装seismic Unix&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;cd ~/Software/seismic_unix
tar -xvf cwp_su_all_44R28.tgz
echo &apos;# Seismic Unix
export CWPROOT=~/Software/seismic_unix
export PATH=$PATH:$CWPROOT/bin&apos; &amp;gt;&amp;gt; ~/.bashrc
~/.bashrc
cp ~/Software/seismic_unix/Makefile.config ~/Software/seismic_unix/src/Makefile.config
cd ~/Software/seismic_unix/src
make install
make xtinstall
make finstall
make utils
make xminstall
make mglinstall
suplane |suximage
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#=======================================================================
#                 Makefile.config for Gnu/Linux
#=======================================================================
#-----------------------------------------------------------------------
# pick up the Make rules (Gnu make required)
#-----------------------------------------------------------------------

include $(CWPROOT)/src/Rules/gnumake.rules
include $(CWPROOT)/src/Rules/abbrev.rules
include $(CWPROOT)/src/Rules/cflags.rules
include $(CWPROOT)/src/Rules/suffix.rules
include $(CWPROOT)/src/Rules/misc.rules
include $(CWPROOT)/src/Rules/opengl.rules

#-----------------------------------------------------------------------
#                      CWP feature options
#-----------------------------------------------------------------------
#
# LINEHDRFLAG=SU_LINEHEADER  - adds 3200 byte text &amp;amp; 400 byte SEG-Y
#                              style line headers to output. CWP/SU
#                              always reads either format unless SUXDR
#                              has been selected.
#
# XDRFLAG=-DSUXDR            - forces all SU data to be big endian
#                              independent of processor architecture
#
# LARGE_FILE_FLAG            - controls access to files &amp;gt; 2 GB on
#                              some systems.
#
# -DSLTSU_SEGY_H             - if defined selects SLT/SU trace header
#                              layout so both packages are compatible
#-----------------------------------------------------------------------

LINEHDRFLAG =

# if the include files  are under  /usr/include/rpc use this for XDR
# whether or not you had to install libtrpc.a
# make sure
XDRFLAG =  -DSUXDR
XDRLFLAGS =
XDRIFLAGS =

# else if you had to install libtirpc and the rpc include files are under
# /usr/include/tirpc/rpc or if you get an error about &amp;lt;types.h&amp;gt; not found,
#  and you want to use XDR, then make sure the next three lines are uncommented
XDRFLAG = -DSUXDR -DSUTIRPC
XDRIFLAGS = -I/usr/include/tirpc/rpc -I/usr/include/tirpc
XDRLFLAGS = -ltirpc

# else if you do not want to use XDR, uncomment the next three lines
#XDRFLAG =
#XDRLFLAGS =
#XDRIFLAGS =


# Most systems are LITTLE_ENDIAN these days
ENDIANFLAG = -DCWP_LITTLE_ENDIAN
LARGE_FILE_FLAG = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE

CWP_FLAGS = $(LARGE_FILE_FLAG) $(ENDIANFLAG) $(XDRFLAG) $(XDRIFLAGS) $(LINEHDRFLAG)

#-----------------------------------------------------------------------
# system stuff
#-----------------------------------------------------------------------

SHELL = /bin/sh
ROOT = $(CWPROOT)

LN = ln # this needs to be changed to cp for FAT32 filesystems
AR = ar
ARFLAGS = rv
RANLIB = ranlib
RANFLAGS =
ICHMODLINE = chmod 644 $@
MCHMODLINE = chmod 755 $@

POSTLFLAGS = $(XDRLFLAGS)

#-----------------------------------------------------------------------
# use both X11 path conventions
#-----------------------------------------------------------------------

IX11 = /usr/X11/include
LX11 = /usr/X11/lib
IMOTIF = /usr/X11R6/include
LMOTIF = /usr/X11R6/lib

LD_LIBRARY_PATH += $(CWPROOT)/lib:${LX11}:${LMOTIF}

#-----------------------------------------------------------------------
# Sun/Oracle compilers  comment out the Gnu compiler section to use
#-----------------------------------------------------------------------

CPP = cpp

CC = cc
#OPTC = -g -Xc  -xc99
OPTC = -O -Xc  -xc99
#CFLAGS = -I$I $(OPTC) $(CWP_FLAGS) -D_BSD_SOURCE -D_POSIX_SOURCE
CFLAGS = -I$I $(OPTC) $(CWP_FLAGS) -D_DEFAULT_SOURCE -D_POSIX_SOURCE

FC = f90 -f77
OPTF = -g
FFLAGS =

C++FLAGS = -I$I $(OPTC) $(CWP_FLAGS)

#-----------------------------------------------------------------------
# Gnu compilers by default just because they are the most common
#-----------------------------------------------------------------------

CPP = cpp

#CC = clang
CC = gcc
#OPTC = -g  -std=c99 -Wall -pedantic -Wno-long-long
OPTC = -O  -std=c99 -Wall -pedantic -Wno-long-long
#CFLAGS = -I$I $(OPTC) $(CWP_FLAGS) -D_BSD_SOURCE -D_POSIX_SOURCE
CFLAGS = -I$I $(OPTC) $(CWP_FLAGS) -D_DEFAULT_SOURCE -D_POSIX_SOURCE

FC = gfortran
FOPTS = -g
FFLAGS = $(FOPTS) -ffixed-line-length-none

C++FLAGS = -I$I $(OPTC) $(CWP_FLAGS)

&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;安装Madagascar&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install unzip
sudo apt install -y libavcodec-dev
cd ~/Software/madagascar
unzip src-master.zip
cd src-master
./configure --prefix=~/Software/madagascar/src-master API=c++,fortran-90
scons
make
make install
echo  &apos;# madagascar
source ~/Software/madagascar/src-master/env.sh&apos; &amp;gt;&amp;gt;~/.bashrc
~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>hugFace 下载</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/hugface%E4%B8%8B%E8%BD%BD/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/hugface%E4%B8%8B%E8%BD%BD/</guid><pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;hugFace 下载&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安装依赖&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;pip install -U huggingface_hub
sudo apt install aria2 -y
wget https://hf-mirror.com/hfd/hfd.sh
chmod a+x hfd.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. 设置&lt;a href=&quot;https://zhida.zhihu.com/search?content_id=240522471&amp;amp;content_type=Article&amp;amp;match_order=1&amp;amp;q=%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F&amp;amp;zhida_source=entity&quot;&gt;环境变量&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Linux&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export HF_ENDPOINT=https://hf-mirror.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Windows Powershell&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$env:HF_ENDPOINT = &quot;https://hf-mirror.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3、 下载实例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./hfd.sh subsurfacegen/field-scale-dataset \
    --dataset \
    --local-dir ./subsurfacegen \
    --include &quot;models/*&quot; &quot;slices/*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;hfd的多线程下载文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
RED=&apos;\033[0;31m&apos;; GREEN=&apos;\033[0;32m&apos;; YELLOW=&apos;\033[1;33m&apos;; DIM=&apos;\033[2m&apos;; BOLD=&apos;\033[1m&apos;; NC=&apos;\033[0m&apos; # No Color

trap &apos;printf &quot;\n%bInterrupted. Re-run to resume.%b\n&quot; &quot;$YELLOW&quot; &quot;$NC&quot;; exit 130&apos; INT

# Format a byte count as a human-readable string (decimal units, matching the HF UI).
human() {
    awk -v b=&quot;${1:-0}&quot; &apos;BEGIN{u=&quot;B KB MB GB TB PB&quot;;n=split(u,a,&quot; &quot;);i=1;
        while(b&amp;gt;=1000&amp;amp;&amp;amp;i&amp;lt;n){b/=1000;i++} printf (i==1?&quot;%d%s&quot;:&quot;%.2f%s&quot;),b,a[i]}&apos;
}

display_help() {
    cat &amp;lt;&amp;lt; EOF
Usage:
  hfd &amp;lt;REPO_ID&amp;gt; [--include include_pattern1 include_pattern2 ...] [--exclude exclude_pattern1 exclude_pattern2 ...] [--hf_username username] [--hf_token token] [--tool aria2c|wget] [-x threads] [-j jobs] [--dataset] [--local-dir path] [--revision rev]

Description:
  Downloads a model or dataset from Hugging Face using the provided repo ID.

Arguments:
  REPO_ID         The Hugging Face repo ID (Required)
                  Format: &apos;org_name/repo_name&apos; or legacy format (e.g., gpt2)
Options:
  include/exclude_pattern The patterns to match against file path, supports wildcard characters.
                  e.g., &apos;--exclude *.safetensor *.md&apos;, &apos;--include vae/*&apos;.
  --include       (Optional) Patterns to include files for downloading (supports multiple patterns).
  --exclude       (Optional) Patterns to exclude files from downloading (supports multiple patterns).
  --hf_username   (Optional) Hugging Face username for authentication (not email).
  --hf_token      (Optional) Hugging Face token for authentication.
  --tool          (Optional) Download tool to use: aria2c (default) or wget.
  -x              (Optional) Number of download threads for aria2c (default: 4).
  -j              (Optional) Number of concurrent downloads for aria2c (default: 5).
  --dataset       (Optional) Flag to indicate downloading a dataset.
  --local-dir     (Optional) Directory path to store the downloaded data.
                             Defaults to the current directory with a subdirectory named &apos;repo_name&apos;
                             if REPO_ID is composed of &apos;org_name/repo_name&apos;.
  --revision      (Optional) Model/Dataset revision to download (default: main).

Example:
  hfd gpt2
  hfd bigscience/bloom-560m --exclude *.safetensors
  hfd meta-llama/Llama-2-7b --hf_username myuser --hf_token mytoken -x 4
  hfd lavita/medical-qa-shared-task-v1-toy --dataset
  hfd bartowski/Phi-3.5-mini-instruct-exl2 --revision 5_0
EOF
    exit 1
}

[[ -z &quot;$1&quot; || &quot;$1&quot; =~ ^-h || &quot;$1&quot; =~ ^--help ]] &amp;amp;&amp;amp; display_help

REPO_ID=$1
shift

# Default values
TOOL=&quot;aria2c&quot;
THREADS=4
CONCURRENT=5
HF_ENDPOINT=${HF_ENDPOINT:-&quot;https://huggingface.co&quot;}
INCLUDE_PATTERNS=()
EXCLUDE_PATTERNS=()
REVISION=&quot;main&quot;

validate_number() {
    [[ &quot;$2&quot; =~ ^[1-9][0-9]*$ &amp;amp;&amp;amp; &quot;$2&quot; -le &quot;$3&quot; ]] || { printf &quot;%b[Error] %s must be 1-%s%b\n&quot; &quot;$RED&quot; &quot;$1&quot; &quot;$3&quot; &quot;$NC&quot;; exit 1; }
}

# Argument parsing
while [[ $# -gt 0 ]]; do
    case $1 in
        --include) shift; while [[ $# -gt 0 &amp;amp;&amp;amp; ! ($1 =~ ^--) &amp;amp;&amp;amp; ! ($1 =~ ^-[^-]) ]]; do INCLUDE_PATTERNS+=(&quot;$1&quot;); shift; done ;;
        --exclude) shift; while [[ $# -gt 0 &amp;amp;&amp;amp; ! ($1 =~ ^--) &amp;amp;&amp;amp; ! ($1 =~ ^-[^-]) ]]; do EXCLUDE_PATTERNS+=(&quot;$1&quot;); shift; done ;;
        --hf_username) HF_USERNAME=&quot;$2&quot;; shift 2 ;;
        --hf_token) HF_TOKEN=&quot;$2&quot;; shift 2 ;;
        --tool)
            [[ &quot;$2&quot; == aria2c || &quot;$2&quot; == wget ]] || { printf &quot;%b[Error] Invalid tool. Use &apos;aria2c&apos; or &apos;wget&apos;.%b\n&quot; &quot;$RED&quot; &quot;$NC&quot;; exit 1; }
            TOOL=&quot;$2&quot;; shift 2 ;;
        -x) validate_number &quot;threads (-x)&quot; &quot;$2&quot; 10; THREADS=&quot;$2&quot;; shift 2 ;;
        -j) validate_number &quot;concurrent downloads (-j)&quot; &quot;$2&quot; 10; CONCURRENT=&quot;$2&quot;; shift 2 ;;
        --dataset) DATASET=1; shift ;;
        --local-dir) LOCAL_DIR=&quot;$2&quot;; shift 2 ;;
        --revision) REVISION=&quot;$2&quot;; shift 2 ;;
        *) display_help ;;
    esac
done

# A fingerprint of the options that affect the file list; a change forces regeneration.
generate_command_string() {
    printf &apos;REPO_ID=%s TOOL=%s INCLUDE=%s EXCLUDE=%s DATASET=%s HF_USERNAME=%s HF_TOKEN=%s HF_ENDPOINT=%s REVISION=%s&apos; \
        &quot;$REPO_ID&quot; &quot;$TOOL&quot; &quot;${INCLUDE_PATTERNS[*]}&quot; &quot;${EXCLUDE_PATTERNS[*]}&quot; &quot;${DATASET:-0}&quot; \
        &quot;${HF_USERNAME:-}&quot; &quot;${HF_TOKEN:-}&quot; &quot;${HF_ENDPOINT:-}&quot; &quot;$REVISION&quot;
}

check_command() {
    if ! command -v &quot;$1&quot; &amp;amp;&amp;gt;/dev/null; then
        printf &quot;%b%s is not installed. Please install it first.%b\n&quot; &quot;$RED&quot; &quot;$1&quot; &quot;$NC&quot;
        exit 1
    fi
}

check_command curl; check_command &quot;$TOOL&quot;

LOCAL_DIR=&quot;${LOCAL_DIR:-${REPO_ID#*/}}&quot;
mkdir -p &quot;$LOCAL_DIR/.hfd&quot;

REPO_API_PATH=&quot;models/$REPO_ID&quot;; DOWNLOAD_API_PATH=&quot;$REPO_ID&quot;
[[ &quot;$DATASET&quot; == 1 ]] &amp;amp;&amp;amp; { REPO_API_PATH=&quot;datasets/$REPO_ID&quot;; DOWNLOAD_API_PATH=$REPO_API_PATH; }

# wget --cut-dirs strips &quot;&amp;lt;download_api_path&amp;gt;/resolve/&amp;lt;revision&amp;gt;/&quot;; a fixed value wrongly
# assumes the org/name form and eats a directory level for legacy (single-name) repo ids.
CUT_DIRS=$(( $(printf &apos;%s&apos; &quot;$DOWNLOAD_API_PATH&quot; | tr -cd &apos;/&apos; | wc -c) + 3 ))

# Metadata API URL (used for the gated/auth check); append revision when not main.
METADATA_API_PATH=&quot;$REPO_API_PATH&quot;
[[ &quot;$REVISION&quot; != &quot;main&quot; ]] &amp;amp;&amp;amp; METADATA_API_PATH=&quot;$METADATA_API_PATH/revision/$REVISION&quot;
API_URL=&quot;$HF_ENDPOINT/api/$METADATA_API_PATH?blobs=true&quot;

METADATA_FILE=&quot;$LOCAL_DIR/.hfd/repo_metadata.json&quot;

fetch_and_save_metadata() {
    status_code=$(curl -L -s -w &quot;%{http_code}&quot; -o &quot;$METADATA_FILE&quot; ${HF_TOKEN:+-H &quot;Authorization: Bearer $HF_TOKEN&quot;} &quot;$API_URL&quot;)
    RESPONSE=$(cat &quot;$METADATA_FILE&quot;)
    if [ &quot;$status_code&quot; -eq 200 ]; then
        printf &quot;%s\n&quot; &quot;$RESPONSE&quot;
    else
        printf &quot;%b[Error] Failed to fetch metadata from %s. HTTP status code: %s.%b\n%s\n&quot; &quot;$RED&quot; &quot;$API_URL&quot; &quot;$status_code&quot; &quot;$NC&quot; &quot;$RESPONSE&quot; &amp;gt;&amp;amp;2
        rm -f &quot;$METADATA_FILE&quot;
        exit 1
    fi
}

# Exit early if the repo is gated/private but no credentials were supplied.
check_authentication() {
    local gated
    if command -v jq &amp;amp;&amp;gt;/dev/null; then
        gated=$(printf &apos;%s&apos; &quot;$1&quot; | jq -r &apos;.gated // false&apos;)
    else
        printf &apos;%s&apos; &quot;$1&quot; | grep -q &apos;&quot;gated&quot;:[^f]&apos; &amp;amp;&amp;amp; gated=true || gated=false
    fi
    if [[ &quot;$gated&quot; != &quot;false&quot; &amp;amp;&amp;amp; ( -z &quot;$HF_TOKEN&quot; || -z &quot;$HF_USERNAME&quot; ) ]]; then
        printf &quot;%bThe repository requires authentication, but --hf_username and --hf_token is not passed. Please get token from https://huggingface.co/settings/tokens.\nExiting.\n%b&quot; &quot;$RED&quot; &quot;$NC&quot;
        exit 1
    fi
}

printf &quot;%b%s%b (%s)\n&quot; &quot;$BOLD&quot; &quot;$REPO_ID&quot; &quot;$NC&quot; &quot;$REVISION&quot;
if [[ ! -f &quot;$METADATA_FILE&quot; ]]; then
    printf &quot;%bFetching metadata...%b\n&quot; &quot;$DIM&quot; &quot;$NC&quot;
    RESPONSE=$(fetch_and_save_metadata) || exit 1
else
    RESPONSE=$(cat &quot;$METADATA_FILE&quot;)
fi
check_authentication &quot;$RESPONSE&quot;

# Total bytes of the revision (cheap, branch-specific); empty if the endpoint lacks this API.
fetch_treesize() {
    local json
    json=$(curl -sSL ${HF_TOKEN:+-H &quot;Authorization: Bearer $HF_TOKEN&quot;} &quot;$HF_ENDPOINT/api/$REPO_API_PATH/treesize/$REVISION&quot;) || return
    if command -v jq &amp;amp;&amp;gt;/dev/null; then
        printf &apos;%s&apos; &quot;$json&quot; | jq -r &apos;.size // empty&apos; 2&amp;gt;/dev/null
    else
        printf &apos;%s&apos; &quot;$json&quot; | grep -o &apos;&quot;size&quot;:[0-9]*&apos; | head -1 | grep -o &apos;[0-9]*&apos;
    fi
}
# Reuse the cached list only if the command is unchanged AND the manifest is intact (its line
# count equals repo_info&apos;s total). An interrupted/failed walk leaves no repo_info, so it re-lists.
should_regenerate_filelist() {
    local cmd=&quot;$LOCAL_DIR/.hfd/last_download_command&quot; mf=&quot;$LOCAL_DIR/.hfd/manifest&quot; info=&quot;$LOCAL_DIR/.hfd/repo_info&quot;
    [[ -f &quot;$mf&quot; &amp;amp;&amp;amp; -f &quot;$info&quot; &amp;amp;&amp;amp; &quot;$(generate_command_string)&quot; == &quot;$(cat &quot;$cmd&quot; 2&amp;gt;/dev/null)&quot; \
       &amp;amp;&amp;amp; &quot;$(wc -l &amp;lt; &quot;$mf&quot;)&quot; == &quot;$(cut -d&apos; &apos; -f1 &quot;$info&quot; 2&amp;gt;/dev/null)&quot; ]] &amp;amp;&amp;amp; return 1
    return 0
}

fileslist_file=&quot;.hfd/${TOOL}_urls.txt&quot;

# Convert a list of wildcard patterns into a single alternation regex.
patterns_to_regex() {
    (($#)) || return 0
    printf &apos;%s\n&apos; &quot;$@&quot; | sed &apos;s/\./\\./g; s/\*/.*/g&apos; | paste -sd &apos;|&apos; -
}

# Emit &quot;size&amp;lt;TAB&amp;gt;path&quot; for every file in a tree page (jq, or a grep/awk fallback).
emit_page_files() {
    if command -v jq &amp;amp;&amp;gt;/dev/null; then
        jq -r &apos;.[] | select(.type==&quot;file&quot;) | &quot;\(.size)\t\(.path)&quot;&apos; &quot;$1&quot;
    else
        # Strip the nested lfs{} object (it has its own &quot;size&quot;) so type/size/path align per entry.
        sed &apos;s/&quot;lfs&quot;:{[^}]*}//g&apos; &quot;$1&quot; \
            | grep -oE &apos;&quot;type&quot;:&quot;[^&quot;]*&quot;|&quot;size&quot;:[0-9]+|&quot;path&quot;:&quot;[^&quot;]*&quot;&apos; \
            | sed &apos;s/&quot;type&quot;:&quot;//; s/&quot;size&quot;://; s/&quot;path&quot;:&quot;//; s/&quot;$//&apos; \
            | awk &apos;NR%3==1{t=$0} NR%3==2{s=$0} NR%3==0{if(t==&quot;file&quot;)print s&quot;\t&quot;$0}&apos;
    fi
}

# Emit &quot;size&amp;lt;TAB&amp;gt;path&quot; for every file from the cached metadata siblings[] (needs jq).
emit_siblings() {
    jq -r &apos;(.siblings // [])[] | &quot;\(.size // 0)\t\(.rfilename)&quot;&apos; &quot;$METADATA_FILE&quot;
}

# True when siblings[] is the complete list: its sizes sum to treesize (so it wasn&apos;t truncated, as
# it is for very large repos). Lets us skip the slow tree walk for typical repos via one API call.
siblings_complete() {
    command -v jq &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; [[ &quot;$REPO_SIZE&quot; =~ ^[0-9]+$ ]] || return 1
    local n s
    read -r n s &amp;lt; &amp;lt;(jq -r &apos;(.siblings // []) as $s | &quot;\($s|length) \([$s[].size // 0]|add // 0)&quot;&apos; &quot;$METADATA_FILE&quot; 2&amp;gt;/dev/null)
    (( ${n:-0} &amp;gt; 0 )) &amp;amp;&amp;amp; [[ &quot;${s:-0}&quot; == &quot;$REPO_SIZE&quot; ]]
}

# Keep only &quot;size&amp;lt;TAB&amp;gt;path&quot; stdin lines matching include/exclude (the *_REGEX globals).
filter_size_path() {
    local size path
    while IFS=$&apos;\t&apos; read -r size path; do
        [[ -z &quot;$path&quot; ]] &amp;amp;&amp;amp; continue
        [[ -n &quot;$INCLUDE_REGEX&quot; &amp;amp;&amp;amp; ! &quot;$path&quot; =~ $INCLUDE_REGEX ]] &amp;amp;&amp;amp; continue
        [[ -n &quot;$EXCLUDE_REGEX&quot; &amp;amp;&amp;amp; &quot;$path&quot; =~ $EXCLUDE_REGEX ]] &amp;amp;&amp;amp; continue
        printf &apos;%s\t%s\n&apos; &quot;${size:-0}&quot; &quot;$path&quot;
    done
}

# Resumably walk the recursive tree into .hfd/manifest.partial (filtered size&amp;lt;TAB&amp;gt;path). After each
# page, checkpoint .hfd/list_state (fingerprint / entries scanned / next cursor) so an interrupted or
# failed walk continues from there instead of restarting. Progress (entries scanned) goes to stderr.
walk_tree() {
    local state=&quot;$LOCAL_DIR/.hfd/list_state&quot; partial=&quot;$LOCAL_DIR/.hfd/manifest.partial&quot;
    local page=&quot;$LOCAL_DIR/.hfd/tree_page.json&quot; fp url scanned=0 headers n saved_fp=&quot;&quot;
    fp=$(generate_command_string)
    [[ -f &quot;$state&quot; &amp;amp;&amp;amp; -f &quot;$partial&quot; ]] &amp;amp;&amp;amp; { read -r saved_fp; read -r scanned; read -r url; } &amp;lt; &quot;$state&quot;
    if [[ &quot;$saved_fp&quot; != &quot;$fp&quot; ]]; then   # no checkpoint, or it belongs to a different command
        url=&quot;$HF_ENDPOINT/api/$REPO_API_PATH/tree/$REVISION?recursive=true&amp;amp;expand=false&quot;
        scanned=0; : &amp;gt; &quot;$partial&quot;
    elif [[ -s &quot;$partial&quot; &amp;amp;&amp;amp; -n &quot;$(tail -c1 &quot;$partial&quot;)&quot; ]]; then
        sed -i &apos;$d&apos; &quot;$partial&quot;   # drop a torn final line from a kill mid-append (the page re-fetches)
    fi
    while [[ -n &quot;$url&quot; ]]; do
        headers=$(curl -sSL ${HF_TOKEN:+-H &quot;Authorization: Bearer $HF_TOKEN&quot;} -D - -o &quot;$page&quot; &quot;$url&quot;) || return 1
        if command -v jq &amp;amp;&amp;gt;/dev/null; then n=$(jq &apos;length&apos; &quot;$page&quot; 2&amp;gt;/dev/null); else n=$(grep -o &apos;&quot;type&quot;:&quot;&apos; &quot;$page&quot; | wc -l); fi
        emit_page_files &quot;$page&quot; | filter_size_path &amp;gt;&amp;gt; &quot;$partial&quot;
        scanned=$(( scanned + ${n:-0} ))
        printf &apos;\r\033[K%bListing files... %d scanned%b&apos; &quot;$DIM&quot; &quot;$scanned&quot; &quot;$NC&quot; &amp;gt;&amp;amp;2
        url=$(printf &apos;%s&apos; &quot;$headers&quot; | tr -d &apos;\r&apos; | grep -i &apos;^link:&apos; \
            | grep -o &apos;&amp;lt;[^&amp;gt;]*&amp;gt;;[[:space:]]*rel=&quot;next&quot;&apos; | sed -n &apos;s/^&amp;lt;\([^&amp;gt;]*\)&amp;gt;.*/\1/p&apos;)
        printf &apos;%s\n%s\n%s\n&apos; &quot;$fp&quot; &quot;$scanned&quot; &quot;$url&quot; &amp;gt; &quot;$state&quot;   # checkpoint after the page is in
    done
    return 0
}

# Dedup .hfd/manifest.partial by path (a resumed walk may re-list its boundary page) into the final
# manifest, and write &quot;&amp;lt;count&amp;gt; &amp;lt;bytes&amp;gt;&quot; totals to filelist_stats.
finalize_filelist() {
    local mf=&quot;$LOCAL_DIR/.hfd/manifest&quot;
    : &amp;gt; &quot;$mf&quot;
    awk -F&apos;\t&apos; -v mf=&quot;$mf&quot; &apos;!seen[$2]++ { print &amp;gt;&amp;gt; mf; n++; s+=$1 } END { print (n+0)&quot; &quot;(s+0) }&apos; \
        &quot;$LOCAL_DIR/.hfd/manifest.partial&quot; &amp;gt; &quot;$LOCAL_DIR/.hfd/filelist_stats&quot;
}

# Build tool input from the manifest; set NEED_COUNT (files still to fetch). One find pass diffs
# the tree, keeping files missing or the wrong size (.aria2 sidecar = in-progress, kept): cheap
# for huge repos, correct after a manual delete. Run from the local dir (manifest paths relative).
build_download_list() {
    local needed=.hfd/needed size path dir cur
    if [[ ! -s .hfd/manifest ]]; then NEED_COUNT=0; : &amp;gt; &quot;$fileslist_file&quot;; return; fi
    awk -F&apos;\t&apos; &apos;
        FNR==NR { want[$2]=$1; ord[++n]=$2; next }
        { p=$2; sub(/^\.\//,&quot;&quot;,p);
          if (p ~ /\.aria2$/) { sub(/\.aria2$/,&quot;&quot;,p); part[p]=1 } else have[p]=$1 }
        END { for (i=1;i&amp;lt;=n;i++) { q=ord[i];
                if ((q in have) &amp;amp;&amp;amp; have[q]==want[q] &amp;amp;&amp;amp; !(q in part)) continue;
                print want[q] &quot;\t&quot; q } }
    &apos; .hfd/manifest &amp;lt;(find . -type f ! -path &apos;./.hfd/*&apos; -printf &apos;%s\t%p\n&apos; 2&amp;gt;/dev/null) &amp;gt; &quot;$needed&quot;
    NEED_COUNT=$(wc -l &amp;lt; &quot;$needed&quot;)
    # Per needed file: drop a wrong-size copy -c/--continue can&apos;t fix in place (aria2c with no
    # .aria2 control file, or a wget file larger than expected) for a fresh refetch; emit the record.
    while IFS=$&apos;\t&apos; read -r size path; do
        [[ -z &quot;$path&quot; ]] &amp;amp;&amp;amp; continue
        if [[ &quot;$TOOL&quot; == &quot;aria2c&quot; ]]; then
            [[ -e &quot;$path&quot; &amp;amp;&amp;amp; ! -e &quot;$path.aria2&quot; ]] &amp;amp;&amp;amp; rm -f &quot;$path&quot;
            dir=&quot;${path%/*}&quot;; [[ &quot;$dir&quot; == &quot;$path&quot; ]] &amp;amp;&amp;amp; dir=&quot;&quot;
            printf &apos;%s/%s/resolve/%s/%s\n dir=%s\n out=%s\n&apos; &quot;$HF_ENDPOINT&quot; &quot;$DOWNLOAD_API_PATH&quot; &quot;$REVISION&quot; &quot;$path&quot; &quot;$dir&quot; &quot;${path##*/}&quot;
            [[ -n &quot;$HF_TOKEN&quot; ]] &amp;amp;&amp;amp; printf &apos; header=Authorization: Bearer %s\n&apos; &quot;$HF_TOKEN&quot;
            printf &apos;\n&apos;
        else
            cur=$(stat -c%s &quot;$path&quot; 2&amp;gt;/dev/null || echo 0); (( cur &amp;gt; size )) &amp;amp;&amp;amp; rm -f &quot;$path&quot;
            printf &apos;%s/%s/resolve/%s/%s\n&apos; &quot;$HF_ENDPOINT&quot; &quot;$DOWNLOAD_API_PATH&quot; &quot;$REVISION&quot; &quot;$path&quot;
        fi
    done &amp;lt; &quot;$needed&quot; &amp;gt; &quot;$fileslist_file&quot;
    rm -f &quot;$needed&quot;
}

if should_regenerate_filelist; then
    command -v jq &amp;amp;&amp;gt;/dev/null || printf &quot;%b[Warning] jq not installed, using grep/awk for json parsing (slower). Consider installing jq.%b\n&quot; &quot;$YELLOW&quot; &quot;$NC&quot;

    # Total size up front (before the long walk); label the call so its few-second wait isn&apos;t silent.
    printf &quot;%bFetching repository info...%b&quot; &quot;$DIM&quot; &quot;$NC&quot;
    REPO_SIZE=$(fetch_treesize); printf &apos;\r\033[K&apos;
    [[ &quot;$REPO_SIZE&quot; =~ ^[0-9]+$ ]] &amp;amp;&amp;amp; printf &quot;%bRepository size: %s%b\n&quot; &quot;$DIM&quot; &quot;$(human &quot;$REPO_SIZE&quot;)&quot; &quot;$NC&quot;
    INCLUDE_REGEX=$(patterns_to_regex &quot;${INCLUDE_PATTERNS[@]}&quot;)
    EXCLUDE_REGEX=$(patterns_to_regex &quot;${EXCLUDE_PATTERNS[@]}&quot;)
    printf &quot;%bListing files...%b&quot; &quot;$DIM&quot; &quot;$NC&quot;
    # Fast path: typical repos return their whole file list in the metadata; only big repos
    # (truncated siblings) need the paginated, resumable tree walk.
    if siblings_complete; then
        rm -f &quot;$LOCAL_DIR/.hfd/list_state&quot;
        emit_siblings | filter_size_path &amp;gt; &quot;$LOCAL_DIR/.hfd/manifest.partial&quot;
        gen_status=${PIPESTATUS[0]}
    else
        walk_tree; gen_status=$?
    fi
    # A failed walk keeps its checkpoint (list_state + manifest.partial), so a re-run resumes.
    (( gen_status == 0 )) || { printf &quot;\n%b[Error] Failed to list repository files. Re-run to resume.%b\n&quot; &quot;$RED&quot; &quot;$NC&quot; &amp;gt;&amp;amp;2; exit 1; }
    finalize_filelist
    read -r TOTAL_FILES SUM_SIZE &amp;lt; &quot;$LOCAL_DIR/.hfd/filelist_stats&quot;
    printf &apos;\r\033[K%bListed %d files (%s)%b\n&apos; &quot;$DIM&quot; &quot;$TOTAL_FILES&quot; &quot;$(human &quot;$SUM_SIZE&quot;)&quot; &quot;$NC&quot;
    # Whole-revision total from treesize; the summed filtered size when include/exclude narrows it.
    TOTAL_SIZE=$REPO_SIZE
    [[ -n &quot;$INCLUDE_REGEX$EXCLUDE_REGEX&quot; || ! &quot;$REPO_SIZE&quot; =~ ^[0-9]+$ ]] &amp;amp;&amp;amp; TOTAL_SIZE=$SUM_SIZE
    printf &apos;%s %s\n&apos; &quot;$TOTAL_FILES&quot; &quot;$TOTAL_SIZE&quot; &amp;gt; &quot;$LOCAL_DIR/.hfd/repo_info&quot;
    # Fingerprint written last: marks the list complete (an interrupted walk has none, so it re-lists).
    generate_command_string &amp;gt; &quot;$LOCAL_DIR/.hfd/last_download_command&quot;
    rm -f &quot;$LOCAL_DIR/.hfd/manifest.partial&quot; &quot;$LOCAL_DIR/.hfd/list_state&quot; &quot;$LOCAL_DIR/.hfd/tree_page.json&quot;
fi

cd &quot;$LOCAL_DIR&quot; || exit 1

# Render one in-place status line; speed = byte delta since last call (PREV_B/PREV_T).
# Fields are fixed-width so columns don&apos;t jitter as values grow a digit; ETA is last.
PREV_B=0; PREV_T=0
render_progress() {
    local now=$1 dfiles=$2 dt sp pct eta e
    dt=$(( SECONDS - PREV_T )); ((dt&amp;lt;1)) &amp;amp;&amp;amp; dt=1
    sp=$(( (now - PREV_B) / dt )); ((sp&amp;lt;0)) &amp;amp;&amp;amp; sp=0; PREV_B=$now; PREV_T=$SECONDS
    pct=0; ((TOTAL_SIZE&amp;gt;0)) &amp;amp;&amp;amp; pct=$(( now * 100 / TOTAL_SIZE )); ((pct&amp;gt;100)) &amp;amp;&amp;amp; pct=100
    # ETA only once speed is meaningful; clamp absurd early estimates to keep it tidy.
    eta=&quot;--:--&quot;; ((sp&amp;gt;0 &amp;amp;&amp;amp; TOTAL_SIZE&amp;gt;now)) &amp;amp;&amp;amp; { e=$(( (TOTAL_SIZE-now)/sp )); ((e&amp;lt;360000)) &amp;amp;&amp;amp; eta=$(printf &apos;%02d:%02d&apos; $((e/60)) $((e%60))); }
    printf &apos;\r\033[K%b[%3d%%]%b %*d/%d files | %9s/%9s | %9s/s | ETA %s&apos; \
        &quot;$GREEN&quot; &quot;$pct&quot; &quot;$NC&quot; &quot;${#TOTAL_FILES}&quot; &quot;$dfiles&quot; &quot;$TOTAL_FILES&quot; \
        &quot;$(human &quot;$now&quot;)&quot; &quot;$(human &quot;$TOTAL_SIZE&quot;)&quot; &quot;$(human &quot;$sp&quot;)&quot; &quot;$eta&quot;
}

# Progress without scanning finished files: manifest totals + a stat of only in-flight files.
monitor_progress() {
    local interval=$1 base=$1 stop_hint=&quot;Stopping download, please wait...&quot;; PREV_T=$SECONDS
    # The main INT trap is deferred until the foreground download returns, so acknowledge
    # Ctrl+C here (fires at once in the subshell) and note the force-stop that already works.
    [[ &quot;$TOOL&quot; == &quot;aria2c&quot; ]] &amp;amp;&amp;amp; stop_hint=&quot;Stopping download, please wait... (press Ctrl+C again to force stop)&quot;
    trap &apos;printf &quot;\n%b%s%b\n&quot; &quot;$YELLOW&quot; &quot;$stop_hint&quot; &quot;$NC&quot;; exit 0&apos; INT
    if [[ &quot;$TOOL&quot; == &quot;wget&quot; ]]; then
        # wget downloads in manifest order, so a forward cursor needs to stat only the
        # current file; everything before it is done and counted by its known size.
        local -a MS MP; local s p
        while IFS=$&apos;\t&apos; read -r s p; do MS+=(&quot;$s&quot;); MP+=(&quot;$p&quot;); done &amp;lt; .hfd/manifest
        local idx=0 done_b=0 cur
        while :; do
            sleep &quot;$interval&quot;
            while (( idx &amp;lt; ${#MP[@]} )); do
                cur=$(stat -c%s &quot;${MP[idx]}&quot; 2&amp;gt;/dev/null) || break
                (( cur &amp;gt;= MS[idx] )) || break
                done_b=$(( done_b + MS[idx] )); idx=$((idx+1))
            done
            cur=0; (( idx &amp;lt; ${#MP[@]} )) &amp;amp;&amp;amp; cur=$(stat -c%s &quot;${MP[idx]}&quot; 2&amp;gt;/dev/null || echo 0)
            render_progress $(( done_b + cur )) &quot;$idx&quot;
        done
    else
        # Parallel downloads finish out of order, so a cursor would miss files completing between
        # ticks. Each tick sums block usage (sparse-aware) of the manifest&apos;s files only — ignoring
        # stale files left from an earlier version of the repo — minus in-progress (.aria2) ones.
        local now files t0 walk
        while :; do
            sleep &quot;$interval&quot;
            t0=$SECONDS
            read -r now files &amp;lt; &amp;lt;(awk -F&apos;\t&apos; &apos;
                FNR==NR { want[$2]=1; next }
                { p=$2; sub(/^\.\//,&quot;&quot;,p)
                  if (p ~ /\.aria2$/) { sub(/\.aria2$/,&quot;&quot;,p); if (p in want) a++; next }
                  if (p in want) { b+=$1; d++ } }
                END { print b*512, d-a }
            &apos; .hfd/manifest &amp;lt;(find . -type f ! -path &apos;./.hfd/*&apos; -printf &apos;%b\t%p\n&apos; 2&amp;gt;/dev/null))
            render_progress &quot;$now&quot; &quot;$files&quot;
            # Self-throttle: if the walk took longer than the base interval, sleep that long
            # next time so scanning stays under ~half the wall-clock at any repo size.
            walk=$(( SECONDS - t0 )); interval=$base; (( walk &amp;gt; base )) &amp;amp;&amp;amp; interval=$walk
        done
    fi
}

# Totals were persisted at file-list generation; reload for resumed runs.
[[ -f .hfd/repo_info ]] &amp;amp;&amp;amp; read -r TOTAL_FILES TOTAL_SIZE &amp;lt; .hfd/repo_info
TOTAL_FILES=${TOTAL_FILES:-0}; TOTAL_SIZE=${TOTAL_SIZE:-0}
FILE_NOUN=&quot;files&quot;; ((TOTAL_FILES==1)) &amp;amp;&amp;amp; FILE_NOUN=&quot;file&quot;

# Diff the local tree against the manifest to find what&apos;s missing, then short-circuit if done.
((TOTAL_FILES&amp;gt;50000)) &amp;amp;&amp;amp; printf &quot;%bChecking local files...%b\n&quot; &quot;$DIM&quot; &quot;$NC&quot;
build_download_list
if (( NEED_COUNT == 0 )); then
    printf &quot;%bUp to date. %s %s in %s%b\n&quot; &quot;$GREEN&quot; &quot;$TOTAL_FILES&quot; &quot;$FILE_NOUN&quot; &quot;$LOCAL_DIR&quot; &quot;$NC&quot;
    exit 0
fi

# &quot;Resuming&quot; if any data is already on disk (completed files or a partial), else a fresh start.
verb=&quot;Downloading&quot;; [[ -n &quot;$(find . -type f ! -path &apos;./.hfd/*&apos; -print -quit 2&amp;gt;/dev/null)&quot; ]] &amp;amp;&amp;amp; verb=&quot;Resuming&quot;
printf &quot;%s %s %s to %s  ·  Ctrl+C to stop, re-run to resume\n&quot; &quot;$verb&quot; &quot;$TOTAL_FILES&quot; &quot;$FILE_NOUN&quot; &quot;$LOCAL_DIR&quot;

# Silence native per-file output (logged to .hfd/download.log) so the monitor owns one
# clean line. Refresh every 1s, backing off for huge repos where the walk gets expensive.
interval=1; ((TOTAL_FILES&amp;gt;50000)) &amp;amp;&amp;amp; interval=5
monitor_progress &quot;$interval&quot; &amp;amp;
MON_PID=$!
trap &apos;kill &quot;$MON_PID&quot; 2&amp;gt;/dev/null&apos; EXIT

if [[ &quot;$TOOL&quot; == &quot;aria2c&quot; ]]; then
    aria2c --quiet=true --log=.hfd/download.log --log-level=error --file-allocation=none \
        -x &quot;$THREADS&quot; -j &quot;$CONCURRENT&quot; -s &quot;$THREADS&quot; -k 1M -c -i &quot;$fileslist_file&quot; &amp;gt;/dev/null
    status=$?
else
    wget -x -nH --cut-dirs=&quot;$CUT_DIRS&quot; ${HF_TOKEN:+--header=&quot;Authorization: Bearer $HF_TOKEN&quot;} \
        --input-file=&quot;$fileslist_file&quot; --continue -nv -o .hfd/download.log
    status=$?
fi

# Clear the live progress line in place; the final status line takes its spot (no blank line).
kill &quot;$MON_PID&quot; 2&amp;gt;/dev/null; wait &quot;$MON_PID&quot; 2&amp;gt;/dev/null; printf &apos;\r\033[K&apos;

if [[ $status -eq 0 ]]; then
    printf &quot;%bDone. %s %s, %s in %s%b\n&quot; &quot;$GREEN&quot; &quot;$TOTAL_FILES&quot; &quot;$FILE_NOUN&quot; &quot;$(human &quot;$TOTAL_SIZE&quot;)&quot; &quot;$LOCAL_DIR&quot; &quot;$NC&quot;
else
    printf &quot;%bDownload incomplete. Re-run to resume. Log: %s%b\n&quot; &quot;$RED&quot; &quot;$PWD/.hfd/download.log&quot; &quot;$NC&quot;
    exit 1
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参考：https://hf-mirror.com/&lt;/p&gt;
</content:encoded></item><item><title>CPU高精度计时</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/cpu%E9%AB%98%E7%B2%BE%E5%BA%A6%E8%AE%A1%E6%97%B6/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/cpu%E9%AB%98%E7%B2%BE%E5%BA%A6%E8%AE%A1%E6%97%B6/</guid><pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;CPU高精度计时&lt;/h1&gt;
&lt;p&gt;为了在C语言中进行准确计时，可以使用&lt;code&gt;clock()&lt;/code&gt;函数，它是C标准库的一部分。&lt;code&gt;clock()&lt;/code&gt;函数返回程序开始执行到调用&lt;code&gt;clock()&lt;/code&gt;函数时处理器时钟的滴答数。每个时钟滴答的持续时间可以通过&lt;code&gt;CLOCKS_PER_SEC&lt;/code&gt;宏来确定，它定义了一秒钟内的时钟滴答数。&lt;/p&gt;
&lt;p&gt;以下是一个使用&lt;code&gt;clock()&lt;/code&gt;函数进行计时的示例：&lt;/p&gt;
&lt;p&gt;复制&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;time.h&amp;gt;

int main() {
    clock_t start, end;
    double cpu_time_used;

    start = clock(); // 开始计时

    // 执行一些操作
    for (long i = 0; i &amp;lt; 1000000; ++i) {
        // 这里是一些你想要计时的代码
    }

    end = clock(); // 结束计时

    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; // 计算使用的CPU时间

    printf(&quot;使用的CPU时间: %f 秒\n&quot;, cpu_time_used);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个例子中，&lt;code&gt;clock()&lt;/code&gt;函数在执行一些操作前后被调用，用来计算这段代码执行所花费的时间。&lt;code&gt;cpu_time_used&lt;/code&gt;变量包含了以秒为单位的CPU时间。&lt;/p&gt;
&lt;p&gt;如果你需要更高精度的计时，可以使用POSIX标准中的&lt;code&gt;gettimeofday()&lt;/code&gt;函数，它在&lt;code&gt;sys/time.h&lt;/code&gt;头文件中定义：&lt;/p&gt;
&lt;p&gt;复制&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;sys/time.h&amp;gt;

int main() {
    struct timeval start, end;
    long mtime, seconds, useconds;

    gettimeofday(&amp;amp;start, NULL); // 开始计时

    // 执行一些操作
    for (long i = 0; i &amp;lt; 1000000; ++i) {
        // 这里是一些你想要计时的代码
    }

    gettimeofday(&amp;amp;end, NULL); // 结束计时

    seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

    mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;

    printf(&quot;使用的CPU时间: %ld 毫秒\n&quot;, mtime);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个例子中，&lt;code&gt;gettimeofday()&lt;/code&gt;函数提供了微秒级的精度，可以用于更精确的计时需求。&lt;code&gt;mtime&lt;/code&gt;变量包含了以毫秒为单位的执行时间。&lt;/p&gt;
</content:encoded></item><item><title>Pyside UI设计</title><link>https://tuoyuangui.github.io/website/posts/typora/gui%E5%B7%A5%E5%85%B7/pyside6/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gui%E5%B7%A5%E5%85%B7/pyside6/</guid><pubDate>Thu, 12 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Pyside UI设计&lt;/h1&gt;
&lt;h2&gt;一、PySide6将UI文件转换为Python代码&lt;/h2&gt;
&lt;p&gt;要将&lt;code&gt;.ui&lt;/code&gt;文件转换为Python代码，你可以使用&lt;code&gt;pyside6-uic&lt;/code&gt;工具，这是PySide6的一部分。以下是如何操作的步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设计UI&lt;/strong&gt;：使用Qt Designer设计你的界面，并保存为&lt;code&gt;.ui&lt;/code&gt;文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;转换UI文件&lt;/strong&gt;：在命令行中，使用&lt;code&gt;pyside6-uic&lt;/code&gt;工具将&lt;code&gt;.ui&lt;/code&gt;文件转换为Python代码。命令如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pyside6-uic your_file.ui -o your_file.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令会生成一个名为&lt;code&gt;your_file.py&lt;/code&gt;的Python文件，其中包含了UI界面的代码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用生成的Python代码&lt;/strong&gt;：在你的应用程序中导入并使用这个生成的Python文件。通常，你需要创建一个继承自&lt;code&gt;QMainWindow&lt;/code&gt;或其他适当父类的窗口，并在这个类中加载UI。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面是一个示例，展示了如何在一个PySide6应用程序中使用转换后的UI代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import sys
from PySide6.QtWidgets import QApplication
from your_file import Ui_MainWindow  # 导入转换后的UI代码

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)  # 初始化UI界面

def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

if __name__ == &apos;__main__&apos;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个示例中，&lt;code&gt;your_file.py&lt;/code&gt;是使用&lt;code&gt;pyside6-uic&lt;/code&gt;工具从&lt;code&gt;.ui&lt;/code&gt;文件转换得到的。&lt;code&gt;MainWindow&lt;/code&gt;类继承了&lt;code&gt;QMainWindow&lt;/code&gt;和&lt;code&gt;Ui_MainWindow&lt;/code&gt;，其中&lt;code&gt;Ui_MainWindow&lt;/code&gt;是转换后的UI类。在&lt;code&gt;MainWindow&lt;/code&gt;的构造函数中，我们调用了&lt;code&gt;setupUi&lt;/code&gt;方法来初始化UI界面。&lt;/p&gt;
</content:encoded></item><item><title>PDF批量操作</title><link>https://tuoyuangui.github.io/website/posts/typora/%E5%85%B6%E4%BB%96%E6%8A%80%E5%B7%A7/pdf%E6%89%B9%E9%87%8F%E6%93%8D%E4%BD%9C/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E5%85%B6%E4%BB%96%E6%8A%80%E5%B7%A7/pdf%E6%89%B9%E9%87%8F%E6%93%8D%E4%BD%9C/</guid><pubDate>Fri, 20 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;PDF批量操作&lt;/h1&gt;
&lt;h2&gt;1、批量转换pdf为jpg&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;    for f in *.pdf; do gs -q -dNOSAFER -r300 -dBATCH -sDEVICE=jpeg -dNOPAUSE -dEPSCrop -sOutputFile=${f%%.*}.jpg $f;  done
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、转换pdf为jpg&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;    gs -q -dNOSAFER -r300 -dBATCH -sDEVICE=jpeg -dNOPAUSE -dEPSCrop -sOutputFile=xx.jpg 1.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、批量提取pdf第一页&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;    for f in `ls`; do pdftk touch $f cat 1 output ./dir/$f; done
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4、打包当前文件夹&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;    zip -r jpg.zip ./
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5、拼接pdf&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;    pdfunite *.pdf all.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	当然也可以合并部分，或者按顺序合并&lt;code&gt;pdfunite 1.pdf 2.pdf 3.pdf 4.pdf all-1234.pdf&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;6、压缩（ghostcript）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -dQUIET -sOutputFile=output.pdf input.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	即大多数情况使用的压缩方式&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true -dColorImageResolution=130 -dNOPAUSE -dBATCH -sOutputFile=output.pdf input.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;不同的压缩模式
-dPDFSETTINGS=/screen,压缩比最大，输出文件最小，质量最低
-dPDFSETTINGS=/ebook,压缩比稍小，输出文件稍大，质量稍高
-dPDFSETTINGS=/prepress,输出文件信息同Acrobat Distiller &quot;Prepress Optimized&quot;设置
-dPDFSETTINGS=/default,缺省的，
-dColorImageResolution=130可以设置图像DPI大小&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】https://blog.csdn.net/lx_ros/article/details/79887562&lt;/p&gt;
</content:encoded></item><item><title>混合编译.c/.cpp与.cu文件</title><link>https://tuoyuangui.github.io/website/posts/typora/cuda/nvcc%E5%8A%A8%E6%80%81%E9%9D%99%E6%80%81%E5%BA%93%E7%BC%96%E8%AF%91/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/cuda/nvcc%E5%8A%A8%E6%80%81%E9%9D%99%E6%80%81%E5%BA%93%E7%BC%96%E8%AF%91/</guid><pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;混合编译.c/.cpp与.cu文件&lt;/h2&gt;
&lt;p&gt;项目中用到cuda编程，写了kernel函数，需要nvcc编译器来编译。.c/.cpp的文件，假定用gcc编译。&lt;/p&gt;
&lt;p&gt;如何混合编译它们，整体思路是：.cu文件编译出的东西，作为最终编译出的可执行程序的链接依赖。&lt;/p&gt;
&lt;p&gt;具体说起来又可以有这几种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分别编译各个文件，最后链接&lt;/li&gt;
&lt;li&gt;将CUDA程序编译为静态库&lt;/li&gt;
&lt;li&gt;将CUDA程序弄成动态库&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中后两种方式更工程化，基于makefile或CMake会更加方便。&lt;/p&gt;
&lt;p&gt;假设手头上的文件为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;test1.cu
test2.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;则具体编译指令、编译脚本如下：&lt;/p&gt;
&lt;h2&gt;方法1：分别编译各个文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;nvcc -c test1.cu
gcc -c test2.c
gcc -o testc test1.o test2.o -lcudart -L/usr/local/cuda/lib64
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;方法2: 将cuda程序编译为静态库&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;nvcc -lib test1.cu -o libtestcu.a
gcc test2.c -ltestcu -L. -lcudart -L/usr/local/cuda/lib64
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;方法3：将CUDA程序弄成动态库&lt;/h2&gt;
&lt;p&gt;以makefile为例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;all: c

c: libtestcu.so
    gcc test2.c -ltestcu -L. -lcudart -L/usr/local/cuda/lib64 -o testc

libtestcu.so: test.cu
    nvcc -o libtestcu.so -shared -Xcompiler -fPIC test1.cu
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;方法4：混合编译.c/.cpp与.cu文件&lt;/h2&gt;
&lt;p&gt;先分别编译，再联合， 编译动态库需要把环境变量&lt;code&gt;$LD_LIBRARY_PATH&lt;/code&gt;进行修改，否则无法成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#/bin/bash

CC=/usr/bin/gcc
NVCC=/usr/local/cuda-11.8/bin/nvcc
LIB=/usr/local/cuda-11.8/lib64
INC=/usr/local/cuda-11.8/include
CFLAGS=-I$(INC) -L$(LIB) -lcudart -lstdc++ -lcuda

SRCCS=$(wildcard *.c)   # .c src  file
SRCUS=$(wildcard *.cu)  # .cu src file

# c
OBJCCS_static =$(patsubst %.c, %.o,  $(SRCCS))
OBJCCS_dynamic=$(patsubst %.c, %.os, $(SRCCS))
# cu
OBJCUS_static =$(patsubst %.cu, %.o,  $(SRCUS))
OBJCUS_dynamic=$(patsubst %.cu, %.os, $(SRCUS))

%.os:%.c
    $(CC) -o $@ -c  -O3  -fPIC -shared -Wall $&amp;lt;
%.o:%.c
    $(CC) -o $@ -c  -O3  -Wall -lm $&amp;lt;

%.os:%.cu
    $(NVCC) -o $@ -c -Xcompiler -fPIC --use_fast_math -O3  $&amp;lt;
%.o:%.cu
    $(NVCC) -o $@ -c  -O3 -lcudart --use_fast_math $&amp;lt;

install_dynamic:$(OBJCUS_dynamic) $(OBJCCS_dynamic)
    $(CC)  -o libdlglcu.so  $^  -fPIC -shared  -lm $(CFLAGS)

install_static:$(OBJCUS_static) $(OBJCCS_static)
    ar rc liblglcu.a  $^
    ranlib liblglcu.a

header:
    paste *.h *.cuh -s &amp;gt; lglcu.h

install: install_dynamic install_static header

clean:
    -rm -rf *.o *.os lglcu.h liblglcu.a libdlglcu.so
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;reference:&lt;/h2&gt;
&lt;p&gt;【1】https://www.cnblogs.com/zjutzz/p/10272424.html&lt;/p&gt;
&lt;p&gt;【2】https://blog.csdn.net/bruce_0712/article/details/78515133&lt;/p&gt;
&lt;p&gt;【3】&lt;a href=&quot;https://www.zangcq.com/2018/03/10/c%E4%B8%8Ecuda%E6%B7%B7%E5%90%88%E7%BC%96%E8%AF%91%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E6%96%87%E4%BB%B6-so/&quot;&gt;C与CUDA混合编译动态链接文件.so – Chuanqiz’s blog (zangcq.com)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Born modeling in Madagascar</title><link>https://tuoyuangui.github.io/website/posts/typora/madagascar/born%E6%A8%A1%E6%8B%9F/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/madagascar/born%E6%A8%A1%E6%8B%9F/</guid><pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Born modeling in Madagascar&lt;/h1&gt;
&lt;h3&gt;1. 数据准备&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;from rsf.proj import *

# Prepare source and velocity
#############################

# Source wavelet
Flow(&apos;wavelet&apos;,None,
     &apos;&apos;&apos;
     spike n1=1500 d1=0.001 k1=201 |
     ricker1 frequency=10
     &apos;&apos;&apos;)
# Source spectra
Result(&apos;spectra&apos;,&apos;wavelet&apos;,
    &apos;&apos;&apos;
    spectra |window n1=50 |
    graph title=&quot;Source Spectra&quot;
    &apos;&apos;&apos;)

# Source location
Flow(&apos;source&apos;,None,
     &apos;&apos;&apos;
     spike n1=501 n2=501 d1=0.01 d2=0.01
     label1=x1 unit1=km label2=x2 unit2=km
     k1=201 k2=251
     &apos;&apos;&apos;)

# Background velocity
Flow(&apos;v0&apos;,&apos;source&apos;,&apos;math output=2.&apos;)

# Velocity perturbation
Flow(&apos;detv&apos;,None,
    &apos;&apos;&apos;
    spike n1=501 d1=0.01 o1=0 k1=300,301,302 mag=0.02 |
    spray axis=2 n=501 d=0.01 o=0 |
    costaper nw2=25
    &apos;&apos;&apos;)

# True velocity
Flow(&apos;vel&apos;,&apos;v0 detv&apos;,&apos;add ${SOURCES[1]}&apos;)
Result(&apos;vel&apos;,
    &apos;&apos;&apos;
    grey scalebar=y barreverse=y
    color=j bias=2.01 title=&quot;Velocity&quot;
    &apos;&apos;&apos;)

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>jupyter 中内联Madagascar绘图</title><link>https://tuoyuangui.github.io/website/posts/typora/python/jupyter-%E4%B8%AD%E5%86%85%E8%81%94madagascar%E7%BB%98%E5%9B%BE/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/python/jupyter-%E4%B8%AD%E5%86%85%E8%81%94madagascar%E7%BB%98%E5%9B%BE/</guid><pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;jupyter 中内联Madagascar绘图&lt;/h1&gt;
&lt;h2&gt;1、 配置修改&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# $RSFROOT/include/Makefile
SConstruct.jupyter: *.scons
    echo &quot;from rsf.proj import *&quot; &amp;gt; $@
    cat $^ &amp;gt;&amp;gt; $@
    echo &quot;&quot; &amp;gt;&amp;gt; $@
    echo &quot;End()&quot; &amp;gt;&amp;gt; $@

## *.vpl-&amp;gt;*.eps-&amp;gt;*.png
%.png: SConstruct.jupyter
    -rm $@
    scons -Qkf SConstruct.jupyter  $@ || ( \
    scons -Qf SConstruct.jupyter Fig/$*.vpl &amp;amp;&amp;amp; \
    vpconvert color=y  Fig/$*.vpl Fig/$*.eps &amp;amp;&amp;amp; \
    convert  -background white -flatten Fig/$*.eps $@ )

#%.png: SConstruct.jupyter
#	-rm $@
#	scons -Qf SConstruct.jupyter  $@ || ( \
#	scons -Qf SConstruct.jupyter Fig/$*.vpl &amp;amp;&amp;amp; \
#	vpconvert pen=gd fat=3 serifs=n bgcolor=w Fig/$*.vpl $@ )
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# /etc/ImageMagick-6/policy.xml
&amp;lt;!--  disable ghostscript format types  --&amp;gt;
&amp;lt;policy xmlns=&quot;&quot; domain=&quot;coder&quot; rights=&quot;read|write&quot; pattern=&quot;PS&quot;/&amp;gt;
&amp;lt;policy xmlns=&quot;&quot; domain=&quot;coder&quot; rights=&quot;read|write&quot; pattern=&quot;PS2&quot;/&amp;gt;
&amp;lt;policy xmlns=&quot;&quot; domain=&quot;coder&quot; rights=&quot;read|write&quot; pattern=&quot;PS3&quot;/&amp;gt;
&amp;lt;policy xmlns=&quot;&quot; domain=&quot;coder&quot; rights=&quot;read|write&quot; pattern=&quot;EPS&quot;/&amp;gt;
&amp;lt;policy xmlns=&quot;&quot; domain=&quot;coder&quot; rights=&quot;read|write&quot; pattern=&quot;PDF&quot;/&amp;gt;
&amp;lt;policy xmlns=&quot;&quot; domain=&quot;coder&quot; rights=&quot;read|write&quot; pattern=&quot;XPS&quot;/&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、绘图&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;%%file plot2d.scons
Result(&apos;vvvv&apos;,&apos;test&apos;,&apos;grey color=j scalebar=y  label1=Depth label2=Distance unit1=m unit2=m title=&quot; &quot; screenratio=0.5&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;view(&apos;vvvv&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./jupyter%20%E4%B8%AD%E5%86%85%E8%81%94Madagascar%E7%BB%98%E5%9B%BE.assets/image-20241119125809911.png&quot; alt=&quot;image-20241119125809911&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>WSL2 卸载安装</title><link>https://tuoyuangui.github.io/website/posts/typora/windows%E7%B3%BB%E7%BB%9F/wsl2%E5%8D%B8%E8%BD%BD%E5%AE%89%E8%A3%85/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/windows%E7%B3%BB%E7%BB%9F/wsl2%E5%8D%B8%E8%BD%BD%E5%AE%89%E8%A3%85/</guid><pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;WSL2 卸载安装&lt;/h1&gt;
&lt;h2&gt;1、 安装&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./WSL2%E5%8D%B8%E8%BD%BD%E5%AE%89%E8%A3%85.assets/image-20240918192056647.png&quot; alt=&quot;image-20240918192056647&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./WSL2%E5%8D%B8%E8%BD%BD%E5%AE%89%E8%A3%85.assets/image-20240918192159308.png&quot; alt=&quot;image-20240918192159308&quot; /&gt;&lt;/p&gt;
&lt;p&gt;启动&lt;code&gt;虚拟机平台&lt;/code&gt;和&lt;code&gt;linux windows&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;2、升级WSL内核和启用虚拟机功能&lt;/h2&gt;
&lt;p&gt;内核地址：https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi&lt;/p&gt;
&lt;p&gt;安装 WSL 2 之前，必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。
以管理员身份打开&lt;code&gt;PowerShell&lt;/code&gt;并运行：重启&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、导入备份&lt;/h2&gt;
&lt;h4&gt;改为默认用户权限&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;查看当前用户 &lt;code&gt;ls /home/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;尝试切换至用户权限 &lt;code&gt;su 用户名&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;切换至&lt;a href=&quot;https://so.csdn.net/so/search?q=root%E6%9D%83%E9%99%90&amp;amp;spm=1001.2101.3001.7020&quot;&gt;root权限&lt;/a&gt; &lt;code&gt;sudo su&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改默认配置文件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;备份 &lt;code&gt;cp /etc/wsl.conf /etc/wsl.conf.bk&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改 &lt;code&gt;vim /etc/wsl.conf&lt;/code&gt; 在最前面增加以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[user]
default=用户名
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package&quot;&gt;旧版 WSL 的手动安装步骤 | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>创建一个Linux文件目录结构图</title><link>https://tuoyuangui.github.io/website/posts/typora/%E5%85%B6%E4%BB%96%E6%8A%80%E5%B7%A7/%E7%94%9F%E6%88%90%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E5%85%B6%E4%BB%96%E6%8A%80%E5%B7%A7/%E7%94%9F%E6%88%90%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95/</guid><pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;创建一个文件目录结构图&lt;/h1&gt;
&lt;p&gt;在README文件中创建一个&lt;a href=&quot;https://so.csdn.net/so/search?q=%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84&amp;amp;spm=1001.2101.3001.7020&quot;&gt;文件目录结构&lt;/a&gt;图通常涉及使用代码块来表示文件和文件夹的层次结构。
这里有一个步骤指南来创建一个基本的文件目录结构图：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;确定结构&lt;/strong&gt;: 首先，你需要确定你想展示的文件和&lt;a href=&quot;https://so.csdn.net/so/search?q=%E6%96%87%E4%BB%B6%E5%A4%B9&amp;amp;spm=1001.2101.3001.7020&quot;&gt;文件夹&lt;/a&gt;的结构。决定哪些目录和文件是重要的，以及它们是如何组织的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用缩进&lt;/strong&gt;: 在README文件中，你可以使用缩进来表示文件和文件夹之间的层次关系。通常，一个缩进可以用一个制表符或者四个空格表示。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用符号&lt;/strong&gt;: 人们通常使用一些特殊的符号来表示文件夹和文件。例如，/ 通常用于表示目录，而文件则直接写文件名。你也可以使用其他符号来增强可读性，比如&lt;code&gt;├─&lt;/code&gt;, &lt;code&gt;└─&lt;/code&gt;, 或 &lt;code&gt;│&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下是一个简单的文件目录结构图的例子：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;project-name/
│
├── dir1/
│   ├── file1.ext
│   └── file2.ext
│
├── dir2/
│   ├── sub-dir1/
│   │   └── file3.ext
│   └── sub-dir2/
│
└── dir3/
    ├── file4.ext
    └── file5.ext
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个例子中:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;project-name&lt;/code&gt; 是最顶层的文件夹。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dir1&lt;/code&gt;,&lt;code&gt;dir2&lt;/code&gt;, &lt;code&gt;dir3&lt;/code&gt; 是它下面的子文件夹。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file1.ext&lt;/code&gt;, &lt;code&gt;file2.ext&lt;/code&gt; 等是文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sub-dir1&lt;/code&gt;, &lt;code&gt;sub-dir2&lt;/code&gt; 是&lt;code&gt;dir2&lt;/code&gt;下的子文件夹。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个结构图可以直接写入Markdown文件中，通常作为&lt;a href=&quot;https://so.csdn.net/so/search?q=%E4%BB%A3%E7%A0%81%E5%9D%97&amp;amp;spm=1001.2101.3001.7020&quot;&gt;代码块&lt;/a&gt;来保持格式一致。这种方式简单且直观，可以帮助读者理解项目的组织结构。&lt;/p&gt;
&lt;h2&gt;自动生成方案&lt;/h2&gt;
&lt;p&gt;在 Windows(需支持WSL)/MacOS/Linux中，可以使用工具&lt;code&gt;tree&lt;/code&gt;来&lt;strong&gt;自动生成目录结构&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;安装tree&lt;/h3&gt;
&lt;p&gt;Windows（WSL）/Linux：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install tree
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MacOS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install tree
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用tree自动生成目录结构&lt;/h3&gt;
&lt;p&gt;进入你需要生成目录结构文件夹，打开终端，输入以下命令，终端将把目录结构直接打印出来：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tree
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你需要控制打印目录的深度，那么可以加一个&lt;code&gt;-L&lt;/code&gt;参数，后面加上目录深度值（1、2、3、…）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tree -L [level]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你需要将内容写入Markdown文件中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tree -L [level] &amp;gt; output.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，你可以将output.md中的内容复制到你的Markdown文件中。&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】https://blog.csdn.net/SoulmateY/article/details/135281617&lt;/p&gt;
</content:encoded></item><item><title>CUDA和C/C++混编</title><link>https://tuoyuangui.github.io/website/posts/typora/cuda/cuda%E6%B7%B7%E7%BC%96/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/cuda/cuda%E6%B7%B7%E7%BC%96/</guid><pubDate>Mon, 12 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;CUDA和C/C++混编&lt;/h1&gt;
&lt;h2&gt;1、编译方式&lt;/h2&gt;
&lt;p&gt;项目中用到cuda编程，写了kernel函数，需要nvcc编译器来编译。.c/.cpp的文件，假定用gcc编译。&lt;/p&gt;
&lt;p&gt;如何混合编译它们，整体思路是：.cu文件编译出的东西，作为最终编译出的可执行程序的链接依赖。&lt;/p&gt;
&lt;p&gt;具体说起来又可以有这几种情况：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;分别编译各个文件，最后链接&lt;/li&gt;
&lt;li&gt;将CUDA程序编译为静态库&lt;/li&gt;
&lt;li&gt;将CUDA程序弄成动态库&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;其中后两种方式更工程化，基于makefile或CMake会更加方便。&lt;/p&gt;
&lt;p&gt;假设手头上的文件为：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;test1.cu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;test2.c&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;则具体编译指令、编译脚本如下：&lt;/p&gt;
&lt;p&gt;**方法1：**分别编译各个文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ nvcc -c test1.cu
$ gcc -c test2.c
$ gcc -o testc test1.o  test2.o -lcudart -L/usr/local/cuda/lib64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**方法2:**将&lt;code&gt;cuda&lt;/code&gt;程序编译为静态库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ nvcc -lib test1.cu -o  libtestcu.a
$ gcc test2.c -ltestcu  -L. -lcudart -L/usr/local/cuda/lib64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**方法3:**将&lt;code&gt;cuda&lt;/code&gt;程序编译为动态库  &lt;strong&gt;以makefile为例&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ all: c
$ c:  libtestcu.so
$ gcc test2.c -ltestcu  -L. -lcudart -L/usr/local/cuda/lib64 -o testc
$ libtestcu.so:  test.cu
$ nvcc -o libtestcu.so  -shared -Xcompiler -fPIC test1.cu
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】 &lt;a href=&quot;https://www.cnblogs.com/zjutzz/p/10272424.html&quot;&gt;https://www.cnblogs.com/zjutzz/p/10272424.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;【2】&lt;a href=&quot;https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html&quot;&gt;NVIDIA CUDA Compiler Driver&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>查看系统硬件信息</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/%E6%9F%A5%E7%9C%8B%E7%B3%BB%E7%BB%9F%E7%A1%AC%E4%BB%B6%E4%BF%A1%E6%81%AF/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/%E6%9F%A5%E7%9C%8B%E7%B3%BB%E7%BB%9F%E7%A1%AC%E4%BB%B6%E4%BF%A1%E6%81%AF/</guid><pubDate>Mon, 12 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;查看系统硬件信息&lt;/h1&gt;
&lt;h2&gt;1、查看物理cpu个数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cat /proc/cpuinfo |grep &quot;physical id&quot;|sort |uniq|wc -l
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、查看核心数量&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;grep &apos;core id&apos; /proc/cpuinfo | sort -u | wc -l
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、查看线程数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;grep &apos;processor&apos; /proc/cpuinfo | sort -u | wc -l
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4、查看cpu型号&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】https://developer.aliyun.com/article/563422&lt;/p&gt;
</content:encoded></item><item><title>CUDA编程入门</title><link>https://tuoyuangui.github.io/website/posts/typora/cuda/cuda%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/cuda/cuda%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;1、什么是CUDA？&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;CUDA是NVIDIA建立在GPU上的一个通用并行计算平台和编程模型，基于CUDA编程可以利用GPUs的并行计算引擎来更加高效地解决比较复杂的计算难题。

GPU包括更多的运算核心，其特别适合数据并行的计算密集型任务；

CPU的运算核心较少，但是其可以实现复杂的逻辑运算。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2、编程基础&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;用host指代CPU及其内存，而用device指代GPU及其内存，CUDA程序中既包含host程序，又包含device程序，它们分别在CPU和GPU上运行。同时，host与device之间可以进行通信，这样它们之间可以进行数据拷贝。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;典型的CUDA程序的执行流程如下：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;分配host内存，并进行数据初始化；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分配device内存，并从host将数据拷贝到device上；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调用CUDA的&lt;strong&gt;核函数&lt;/strong&gt;在device上完成指定的运算；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将device上的运算结果拷贝到host上；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;释放device和host上分配的内存。&lt;/p&gt;
&lt;p&gt;上面流程中最重要的一个过程是调用&lt;strong&gt;CUDA的核函数&lt;/strong&gt;来执行并行计算，&lt;a href=&quot;https://link.zhihu.com/?target=http%3A//docs.nvidia.com/cuda/cuda-c-programming-guide/index.html%23kernels&quot;&gt;kernel&lt;/a&gt;是CUDA中一个重要的概念，kernel是在device上线程中并行执行的函数，核函数用&lt;code&gt;__global__&lt;/code&gt;符号声明（告诉编译器，在GPU上运行），在调用时需要用&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;grid, block&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;来指定kernel要执行的线程数量，在CUDA中，每一个线程都要执行核函数，并且每个线程会分配一个唯一的线程号thread ID，这个ID值可以通过核函数的内置变量&lt;code&gt;threadIdx&lt;/code&gt;来获得。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./CUDA%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8.assets/image-20240528172155532-1716888118482-1.png&quot; alt=&quot;image-20240528172155532&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;由于GPU实际上是异构模型，所以需要区分host和device上的代码，在CUDA中是通过函数类型限定词开区别host和device上的函数，主要的三个函数类型限定词如下
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;__global__&lt;/code&gt;：在device上执行，从host中调用（一些特定的GPU也可以从device上调用），返回类型必须是&lt;code&gt;void&lt;/code&gt;，不支持可变参数参数，不能成为类成员函数。注意用&lt;code&gt;__global__&lt;/code&gt;定义的kernel是&lt;strong&gt;异步&lt;/strong&gt;的，这意味着host不会等待kernel执行完就执行下一步。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;__device__&lt;/code&gt;：在device上执行，单仅可以从device中调用，不可以和&lt;code&gt;__global__&lt;/code&gt;同时用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;__host__&lt;/code&gt;：在host上执行，仅可以从host上调用，一般省略不写，不可以和&lt;code&gt;__global__&lt;/code&gt;同时用，但可和&lt;code&gt;__device__&lt;/code&gt;，此时函数会在device和host都编译。&lt;/p&gt;
&lt;p&gt;必须要对kernel的线程层次结构有一个清晰的认识。首先GPU上很多并行化的轻量级线程。kernel在device上执行时实际上是启动很多线程，一个kernel所启动的所有线程称为一个&lt;strong&gt;网格&lt;/strong&gt;（grid），同一个网格上的线程共享相同的全局内存空间，grid是线程结构的第一层次，而网格又可以分为很多&lt;strong&gt;线程块&lt;/strong&gt;（block），一个线程块里面包含很多线程，这是第二个层次。线程两层组织结构如下图所示，这是一个gird和block均为2-dim的线程组织。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./CUDA%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8.assets/image-20240528172222595.png&quot; alt=&quot;image-20240528172222595&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dim3 grid(3, 2);
dim3 block(5, 3);
kernel_fun&amp;lt;&amp;lt;&amp;lt; grid, block &amp;gt;&amp;gt;&amp;gt;(prams...);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;一个线程需要两个内置的坐标变量（blockIdx，threadIdx）来唯一标识，它们都是`dim3`类型变量，其中blockIdx指明线程所在grid中的位置，而threaIdx指明线程所在block中的位置，如图中的Thread (1,1)满足：
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;threadIdx.x = 1
threadIdx.y = 1
blockIdx.x = 1
blockIdx.y = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;一个线程块上的线程是放在同一个流式多处理器（SM)上的，但是单个SM的资源有限，这导致线程块中的线程数是有限制的，现代GPUs的线程块可支持的线程数可达1024个。有时候，我们要知道一个线程在blcok中的全局ID，此时就必须还要知道block的组织结构，这是通过线程的内置变量blockDim来获得。它获取线程块各个维度的大小。对于一个2-dim的block $(D_{x},D_{y})$，线程$(x,y)$  的ID值为$(x+y*D_{x})$  ，如果是3-dim的block$ (D_{x},D_{y},D_{z})$  ，线程 $(x,y,z)$ 的ID值为$(x+y*D_{x}+z*D_{x}*D_{y})$  。另外线程还有内置变量gridDim，用于获得网格块各个维度的大小。

kernel的这种线程组织结构天然适合vector,matrix等运算，如我们将利用上图dim结构实现两个矩阵的加法，每个线程负责处理每个位置的两个元素相加，代码如下所示。线程块大小为(16, 16)，然后将N*N大小的矩阵均分为不同的线程块来执行加法运算.
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// Kernel定义
__global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N])
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    int j = blockIdx.y * blockDim.y + threadIdx.y;
    if (i &amp;lt; N &amp;amp;&amp;amp; j &amp;lt; N)
        C[i][j] = A[i][j] + B[i][j];
}
int main()
{
    ...
    // Kernel 线程配置
    dim3 threadsPerBlock(16, 16);
    dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);
    // kernel调用
    MatAdd&amp;lt;&amp;lt;&amp;lt;numBlocks, threadsPerBlock&amp;gt;&amp;gt;&amp;gt;(A, B, C);
    ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;由于SM的基本执行单元是包含32个线程的线程束，所以block大小一般要设置为32的倍数.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置检查：&lt;/strong&gt;（在进行CUDA编程前，可以先检查一下自己的GPU的硬件配置）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  int dev = 0;
    cudaDeviceProp devProp;
    CHECK(cudaGetDeviceProperties(&amp;amp;devProp, dev));
    std::cout &amp;lt;&amp;lt; &quot;使用GPU device &quot; &amp;lt;&amp;lt; dev &amp;lt;&amp;lt; &quot;: &quot; &amp;lt;&amp;lt; devProp.name &amp;lt;&amp;lt; std::endl;
    std::cout &amp;lt;&amp;lt; &quot;SM的数量：&quot; &amp;lt;&amp;lt; devProp.multiProcessorCount &amp;lt;&amp;lt; std::endl;
    std::cout &amp;lt;&amp;lt; &quot;每个线程块的共享内存大小：&quot; &amp;lt;&amp;lt; devProp.sharedMemPerBlock / 1024.0 &amp;lt;&amp;lt; &quot; KB&quot; &amp;lt;&amp;lt; std::endl;
    std::cout &amp;lt;&amp;lt; &quot;每个线程块的最大线程数：&quot; &amp;lt;&amp;lt; devProp.maxThreadsPerBlock &amp;lt;&amp;lt; std::endl;
    std::cout &amp;lt;&amp;lt; &quot;每个EM的最大线程数：&quot; &amp;lt;&amp;lt; devProp.maxThreadsPerMultiProcessor &amp;lt;&amp;lt; std::endl;
    std::cout &amp;lt;&amp;lt; &quot;每个SM的最大线程束数：&quot; &amp;lt;&amp;lt; devProp.maxThreadsPerMultiProcessor / 32 &amp;lt;&amp;lt; std::endl;

    // 输出如下
    使用GPU device 0: GeForce GT 730
    SM的数量：2
    每个线程块的共享内存大小：48 KB
    每个线程块的最大线程数：1024
    每个EM的最大线程数：2048
    每个EM的最大线程束数：64
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3、一些示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;CUDA编程中内存管理API。首先是在device上分配内存的**cudaMalloc函数**，这个函数和C语言中的malloc类似，但是在device上申请一定字节大小的显存。其中devPtr是指向所分配内存的指针。同时要释放分配的内存使用**cudaFree函数**，这和C语言中的free函数对应。
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cudaError_t cudaMalloc(void** devPtr, size_t size);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;重要的函数是负责host和device之间数据通信的**cudaMemcpy函数**：
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;其中src指向数据源，而dst是目标区域，count是复制的字节数，其中kind控制复制的方向：cudaMemcpyHostToHost, cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost及cudaMemcpyDeviceToDevice，如cudaMemcpyHostToDevice将host上数据拷贝到device上。
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;向量加法&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;定义kernel：
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// 两个向量加法kernel，grid和block均为一维
__global__ void add(float* x, float * y, float* z, int n)
{
    // 获取全局索引
    int index = threadIdx.x + blockIdx.x * blockDim.x;
    // 步长
    int stride = blockDim.x * gridDim.x;
    for (int i = index; i &amp;lt; n; i += stride)
    {
        z[i] = x[i] + y[i];
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;stride是整个grid的线程数，有时候向量的元素数很多，这时候可以将在每个线程实现多个元素（元素总数/线程总数）的加法，相当于使用了多个grid来处理，这是一种[grid-stride loop](https://link.zhihu.com/?target=https%3A//devblogs.nvidia.com/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/)方式，不过下面的例子一个线程只处理一个元素，所以kernel里面的循环是不执行的。下面我们具体实现向量加法：
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;int main()
{
    int N = 1 &amp;lt;&amp;lt; 20;    // 二进制编码左移20
    int nBytes = N * sizeof(float);
    // 申请host内存
    float *x, *y, *z;
    x = (float*)malloc(nBytes);
    y = (float*)malloc(nBytes);
    z = (float*)malloc(nBytes);

    // 初始化数据
    for (int i = 0; i &amp;lt; N; ++i)
    {
        x[i] = 10.0;
        y[i] = 20.0;
    }

    // 申请device内存
    float *d_x, *d_y, *d_z;
    cudaMalloc((void**)&amp;amp;d_x, nBytes);
    cudaMalloc((void**)&amp;amp;d_y, nBytes);
    cudaMalloc((void**)&amp;amp;d_z, nBytes);

    // 将host数据拷贝到device
    cudaMemcpy((void*)d_x, (void*)x, nBytes, cudaMemcpyHostToDevice);
    cudaMemcpy((void*)d_y, (void*)y, nBytes, cudaMemcpyHostToDevice);
    // 定义kernel的执行配置
    dim3 blockSize(256);
    dim3 gridSize((N + blockSize.x - 1) / blockSize.x);
    // 执行kernel
    add &amp;lt;&amp;lt; &amp;lt; gridSize, blockSize &amp;gt;&amp;gt; &amp;gt;(d_x, d_y, d_z, N);

    // 将device得到的结果拷贝到host
    cudaMemcpy((void*)z, (void*)d_z, nBytes, cudaMemcpyDeviceToHost);

    // 检查执行结果
    float maxError = 0.0;
    for (int i = 0; i &amp;lt; N; i++)
        maxError = fmax(maxError, fabs(z[i] - 30.0));
    std::cout &amp;lt;&amp;lt; &quot;最大误差: &quot; &amp;lt;&amp;lt; maxError &amp;lt;&amp;lt; std::endl;

    // 释放device内存
    cudaFree(d_x);
    cudaFree(d_y);
    cudaFree(d_z);
    // 释放host内存
    free(x);
    free(y);
    free(z);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;这里我们的向量大小为1&amp;lt;&amp;lt;20，而block大小为256，那么grid大小是4096，kernel的线程层级结构如下图所示：
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./CUDA%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8.assets/image-20240528172242065.png&quot; alt=&quot;image-20240528172242065&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>常用脚本</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/bash-%E6%8A%80%E5%B7%A7/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/bash-%E6%8A%80%E5%B7%A7/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;常用脚本&lt;/h1&gt;
&lt;p&gt;从脚本文件中获取名称并处理&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mapfile -t files &amp;lt; &quot;SUFILE_2-55.txt&quot;
for f in &quot;${files[@]}:&quot;; do
    echo &quot;processing: $f&quot;
    sfsuwrite&amp;lt;cspshot/splict_shot_data/$f tfile=cspshot/splict_hdr_data/$f endian=0 &amp;gt;${f}su
    cat ${f}su &amp;gt;&amp;gt;total.su
done

bash run.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;介绍 $0、$1、$2、$#、$@、$*、$? 的含义&lt;/h1&gt;
&lt;p&gt;在编写 Linux bash shell 脚本时，经常会用到 &lt;code&gt;$0、$1、$2、$#、$@、$*、$?&lt;/code&gt; 等参数。下面具体说明这些参数的含义。&lt;/p&gt;
&lt;p&gt;假设执行 &lt;code&gt;./test.sh a b c&lt;/code&gt; 这样一个命令，则可以使用下面的参数来获取一些值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$0&lt;/code&gt;
对应 &lt;em&gt;./test.sh&lt;/em&gt; 这个值。如果执行的是 &lt;code&gt;./work/test.sh&lt;/code&gt;， 则对应 &lt;em&gt;./work/test.sh&lt;/em&gt; 这个值，而不是只返回文件名本身的部分。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$1&lt;/code&gt;
会获取到 a，即 &lt;code&gt;$1&lt;/code&gt; 对应传给脚本的第一个参数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$2&lt;/code&gt;
会获取到 b，即 &lt;code&gt;$2&lt;/code&gt; 对应传给脚本的第二个参数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$3&lt;/code&gt;
会获取到 c，即 &lt;code&gt;$3&lt;/code&gt; 对应传给脚本的第三个参数。&lt;code&gt;$4&lt;/code&gt;、&lt;code&gt;$5&lt;/code&gt; 等参数的含义依此类推。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$#&lt;/code&gt;
会获取到 3，对应传入脚本的参数个数，统计的参数不包括 &lt;code&gt;$0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$@&lt;/code&gt;
会获取到 &quot;a&quot; &quot;b&quot; &quot;c&quot;，也就是所有参数的列表，不包括 &lt;code&gt;$0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$*&lt;/code&gt;
也会获取到 &quot;a&quot; &quot;b&quot; &quot;c&quot;， 其值和 &lt;code&gt;$@&lt;/code&gt; 相同。但 &lt;code&gt;&quot;$*&quot;&lt;/code&gt; 和 &lt;code&gt;&quot;$@&quot;&lt;/code&gt; 有所不同。
&lt;code&gt;&quot;$*&quot;&lt;/code&gt; 把所有参数合并成一个字符串，而 &lt;code&gt;&quot;$@&quot;&lt;/code&gt; 会得到一个字符串参数数组。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$?&lt;/code&gt;
可以获取到执行 &lt;code&gt;./test.sh a b c&lt;/code&gt; 命令后的返回值。
在执行一个前台命令后，可以立即用 &lt;code&gt;$?&lt;/code&gt; 获取到该命令的返回值。
该命令可以是系统自身的命令，可以是 shell 脚本，也可以是自定义的 bash 函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当执行系统自身的命令时，&lt;code&gt;$?&lt;/code&gt; 对应这个命令的返回值。
当执行 shell 脚本时，&lt;code&gt;$?&lt;/code&gt; 对应该脚本调用 &lt;code&gt;exit&lt;/code&gt; 命令返回的值。如果没有主动调用 &lt;code&gt;exit&lt;/code&gt; 命令，默认返回为 0。
当执行自定义的 bash 函数时，&lt;code&gt;$?&lt;/code&gt; 对应该函数调用 &lt;code&gt;return&lt;/code&gt; 命令返回的值。如果没有主动调用 &lt;code&gt;return&lt;/code&gt; 命令，默认返回为 0。&lt;/p&gt;
&lt;p&gt;下面举例说明 &lt;code&gt;&quot;$*&quot;&lt;/code&gt; 和 &lt;code&gt;&quot;$@&quot;&lt;/code&gt; 的差异。假设有一个 &lt;code&gt;testparams.sh&lt;/code&gt; 脚本，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

for arg in &quot;$*&quot;; do
    echo &quot;****:&quot; $arg
done
echo --------------
for arg in &quot;$@&quot;; do
    echo &quot;@@@@:&quot; $arg
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个脚本分别遍历 &lt;code&gt;&quot;$*&quot;&lt;/code&gt; 和 &lt;code&gt;&quot;$@&quot;&lt;/code&gt; 扩展后的内容，并打印出来。&lt;/p&gt;
&lt;p&gt;执行 &lt;code&gt;./testparams.sh&lt;/code&gt; 脚本，结果如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./testparams.sh This is a test
****: This is a test
--------------
@@@@: This
@@@@: is
@@@@: a
@@@@: test
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，&lt;code&gt;&quot;$*&quot;&lt;/code&gt; 只产生一个字符串，for 循环只遍历一次。
而 &lt;code&gt;&quot;$@&quot;&lt;/code&gt; 产生了多个字符串，for 循环遍历多次，是一个字符串参数数组。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果传入的参数多于 9 个，则不能使用 &lt;code&gt;$10&lt;/code&gt; 来引用第 10 个参数，而是要用 &lt;code&gt;${10}&lt;/code&gt; 来引用。&lt;/p&gt;
&lt;p&gt;即，需要用大括号&lt;code&gt;{}&lt;/code&gt;把大于 9 的数字括起来。
例如，&lt;code&gt;${10}&lt;/code&gt; 表示获取第 10 个参数的值，写为 &lt;code&gt;$10&lt;/code&gt; 获取不到第 10 个参数的值。
实际上，&lt;code&gt;$10&lt;/code&gt; 相当于 &lt;code&gt;${1}0&lt;/code&gt;，也就是先获取 &lt;code&gt;$1&lt;/code&gt; 的值，后面再跟上 0。
如果 &lt;code&gt;$1&lt;/code&gt; 的值是 &quot;first&quot;，则 &lt;code&gt;$10&lt;/code&gt; 的值是 &quot;first0&quot;。&lt;/p&gt;
&lt;p&gt;查看 man bash 里面对位置参数（positional parameters）的说明如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Positional Parameters&lt;/strong&gt;
A positional parameter is a parameter denoted by one or more digits, other than the single digit 0.Positional parameters are assigned from the shell&apos;s arguments when it is invoked, and may be reassigned using the set builtin command.
Positional parameters may not be assigned to with assignment statements.
The positional parameters are temporarily replaced when a shell function is executed.&lt;/p&gt;
&lt;p&gt;When a positional parameter consisting of more than a single digit is expanded, it must be enclosed in braces.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;即，最后一句提到，当位置参数由多位数字组成时，需要用大括号&lt;code&gt;{}&lt;/code&gt;把多位数字括起来。&lt;/p&gt;
&lt;h2&gt;获取位置参数的个数&lt;/h2&gt;
&lt;p&gt;在 bash 中，可以使用 &lt;code&gt;$#&lt;/code&gt; 来获取传入的命令行或者传入函数的参数个数。
要注意的是，&lt;code&gt;$#&lt;/code&gt; 统计的参数个数不包括脚本自身名称或者函数名称。
例如，执行 &lt;code&gt;./a.sh a b&lt;/code&gt;，则 &lt;code&gt;$#&lt;/code&gt; 是 2，而不是 3。&lt;/p&gt;
&lt;p&gt;查看 man bash 的说明如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Special Parameters&lt;/strong&gt;
&lt;strong&gt;#&lt;/strong&gt; Expands to the number of positional parameters in decimal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以看到，&lt;code&gt;$#&lt;/code&gt; 实际上是扩展为位置参数（positional parameters）的个数，统计的参数不包括 &lt;code&gt;$0&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】 https://segmentfault.com/a/1190000021435389&lt;/p&gt;
</content:encoded></item><item><title>Linux系统</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/linux%E7%B3%BB%E7%BB%9F/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/linux%E7%B3%BB%E7%BB%9F/</guid><pubDate>Tue, 12 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Linux系统&lt;/h1&gt;
&lt;h2&gt;1、系统目录&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;bin：存放二进制可执行文件&lt;/p&gt;
&lt;p&gt;boot：存放开机启动程序&lt;/p&gt;
&lt;p&gt;dev：存放设备文件： 字符设备、块设备&lt;/p&gt;
&lt;p&gt;home：存放普通用户&lt;/p&gt;
&lt;p&gt;etc：用户信息和系统配置文件 passwd、group&lt;/p&gt;
&lt;p&gt;lib：库文件：libc.so.6&lt;/p&gt;
&lt;p&gt;root：管理员宿主目录（家目录）&lt;/p&gt;
&lt;p&gt;usr：用户资源管理目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2、文件类型&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Linux系统文件类型： 7/8 种&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;普通文件：-&lt;/p&gt;
&lt;p&gt;目录文件：d&lt;/p&gt;
&lt;p&gt;字符设备文件：c&lt;/p&gt;
&lt;p&gt;块设备文件：b&lt;/p&gt;
&lt;p&gt;软连接：l&lt;/p&gt;
&lt;p&gt;管道文件：p&lt;/p&gt;
&lt;p&gt;套接字：s&lt;/p&gt;
&lt;p&gt;未知文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3、软硬链接&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;软连接：快捷方式&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ln -s file file.hard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为保证软连接可以任意搬移， 创建时务必对源文件使用绝对路径。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;硬链接：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ln file file.hard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;操作系统给每一个文件赋予唯一的 inode，当有相同inode的文件存在时，彼此同步。&lt;/p&gt;
&lt;p&gt;删除时，只将硬链接计数减一。减为0时，inode 被释放。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;4、用户操作&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;创建用户：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo adduser 新用户名        --- useradd

sudo useradd  -m -g siig -d /data1/userlogin/liguolong -s /bin/bash name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;修改文件所属用户：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown 新用户名 待修改文件。

sudo chown wangwu a.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除用户：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo deluser 用户名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;创建用户组：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo addgroup 新组名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;修改文件所属用户组：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chgrp 新用户组名 待修改文件。

sudo chgrp g88 a.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除组：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo delgroup 用户组名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;使用chown 一次修改所有者和所属组：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown 所有者：所属组 待操作文件。
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>矩阵运算</title><link>https://tuoyuangui.github.io/website/posts/typora/%E6%95%B0%E5%AD%A6%E6%96%B9%E6%B3%95/%E7%9F%A9%E9%98%B5%E8%BF%90%E7%AE%97/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E6%95%B0%E5%AD%A6%E6%96%B9%E6%B3%95/%E7%9F%A9%E9%98%B5%E8%BF%90%E7%AE%97/</guid><pubDate>Tue, 12 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;矩阵运算&lt;/h1&gt;
&lt;h2&gt;1、矩阵求导公式&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./%E7%9F%A9%E9%98%B5%E8%BF%90%E7%AE%97.assets/clip_image001.png&quot; alt=&quot;求导代数&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>什么是深度学习？（从函数逼近论的角度来理解）</title><link>https://tuoyuangui.github.io/website/posts/typora/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/</guid><pubDate>Tue, 12 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Title: 什么是深度学习？（从函数逼近论的角度来理解）&lt;/p&gt;
&lt;p&gt;URL Source: http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.html&lt;/p&gt;
&lt;p&gt;Markdown Content:
&lt;strong&gt;什么是深度学习？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;-&lt;/strong&gt; &lt;strong&gt;45****分钟理解深度神经网络和深度学习&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu&quot;&gt;刘利刚&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://gcl.ustc.edu.cn/&quot;&gt;中国科学技术大学图形与几何计算实验室&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu&quot;&gt;http://staff.ustc.edu.cn/~lgliu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;【绪言】&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;近年来，人工智能（Artificial Intelligence, AI）和深度学习（Deep Learning, DL）非常火爆，在各个领域得到了广泛的应用。在笔者所从事的&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/CG/What_is_CG.htm&quot;&gt;计算机图形学&lt;/a&gt;领域，也出现了越来越多的使用深度学习方法来解决各种问题的研究工作。2018年7月初，笔者首次在第七届&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu/Courses/SummerSchool/USTC-summer-school.html&quot;&gt;中国科学技术大学《计算机图形学前沿》暑期课程&lt;/a&gt;上讲授和分享了笔者从数学（函数逼近论）的角度来对基于深度神经网络（Deep Neural Network, DNN）的深度学习的进行理解。之后，不断有学生来向笔者进一步询问和交流有关资料和问题。为了使学生们能够更好、更快理解和使用深度神经网络和深度学习，特撰写此文。&lt;/p&gt;
&lt;p&gt;本文的目的是帮助非人工智能领域的学生（主要是计算机图形学领域的学生及笔者的学生）来搞懂深度学习（这里指狭义的深度学习，即基于DNN的深度学习）的基本概念和方法。笔者尝试用通俗的语言，从函数逼近论的角度来阐释深度神经网络的本质。由于笔者的主要研究领域为&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/CG/What_is_CG.htm&quot;&gt;计算机图形学&lt;/a&gt;，而非人工智能领域，因此本文仅仅为笔者从外行的角度对基于DNN的深度学习的粗浅理解，而非人工智能领域对DNN和深度学习的权威解释。因而，笔者对其中的有些内容的理解是有限的，甚至是有误的。如有不当之处，还请读者指正！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、&lt;/strong&gt;   &lt;strong&gt;从数据拟合说起&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在大学的《数学分析》、《微积分》或者《数值分析》中，大家都已学习并熟悉数据拟合问题及求解拟合问题的最小二乘法。&lt;/p&gt;
&lt;p&gt;1.1.            数据拟合问题&lt;/p&gt;
&lt;p&gt;在科学技术的各领域中，我们所研究的事件一般都是有规律（因果关系）的，即自变量集合&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image001.png&quot; alt=&quot;Image 1&quot; /&gt;与应变量集合&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image002.png&quot; alt=&quot;Image 2&quot; /&gt;之间存在的对应关系通常用映射来描述&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image003.png&quot; alt=&quot;Image 3&quot; /&gt;（特殊情况：实数集合&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image004.png&quot; alt=&quot;Image 4&quot; /&gt;到实数集合&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image004.png&quot; alt=&quot;Image 5&quot; /&gt;之间的映射称为函数）。这样能根据映射（函数）规律作出预测并用于实际应用。&lt;/p&gt;
&lt;p&gt;有些函数关系可由理论分析推导得出，不仅为进一步的分析研究工作提供理论基础，也可以方便的解决实际工程问题。比如，适合于宏观低速物体的牛顿第二运动定律&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image005.png&quot; alt=&quot;Image 6&quot; /&gt;就是在实际观察和归纳中得出的普适性力学定律。&lt;/p&gt;
&lt;p&gt;但是，很多工程问题难以直接推导出变量之间的函数表达式；或者即使能得出表达式，公式也十分复杂，不利于进一步的分析与计算。这时可以通过诸如采样、实验等方法获得若干离散的数据（称为样本数据点），然后根据这些数据，希望能得到这些变量之间的函数关系，这个过程称为数据拟合（Data fitting），在数理统计中也称为回归分析（Regression analysis）。&lt;/p&gt;
&lt;p&gt;这里值得提一下，在实际应用中，还有一类问题是输出的结果&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image002.png&quot; alt=&quot;Image 7&quot; /&gt;是离散型的（比如识别图片里是人、猫、狗等标签的一种），此时问题称为分类（Classification）。&lt;/p&gt;
&lt;p&gt;1.2.            数据拟合类型&lt;/p&gt;
&lt;p&gt;我们先考虑最简单的情形，即实数到实数的一元函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image006.png&quot; alt=&quot;Image 8&quot; /&gt;。假设通过实验获得了&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image007.png&quot; alt=&quot;Image 9&quot; /&gt;个样本点&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image008.png&quot; alt=&quot;Image 10&quot; /&gt;。我们希望求得反映这些样本点规律的一个函数关系&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image009.png&quot; alt=&quot;Image 11&quot; /&gt;，如图1所示。&lt;/p&gt;
&lt;p&gt;如果要求函数严格通过每个样本点，即&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image010.png&quot; alt=&quot;&quot; /&gt; ， (1.1)&lt;/p&gt;
&lt;p&gt;则求解函数的问题称为插值问题（Interpolation）。&lt;/p&gt;
&lt;p&gt;一般地，由于实验数据带有观测误差，因此在大部分情况下，我们只要求函数反映这些样本点的趋势，即函数靠近样本点且误差在某种度量意义下最小，称为逼近问题（Approximation）。若记在某点的误差为&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image011.png&quot; alt=&quot;&quot; /&gt; (1.2)&lt;/p&gt;
&lt;p&gt;且记误差向量为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image012.png&quot; alt=&quot;Image 14&quot; /&gt;。逼近问题就是要求向量&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image013.png&quot; alt=&quot;Image 15&quot; /&gt;的某种范数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image014.png&quot; alt=&quot;Image 16&quot; /&gt;最小。一般采用欧氏范数（&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image015.png&quot; alt=&quot;Image 17&quot; /&gt;范数）作为误差度量的标准（比较容易计算），即求如下极小化问题：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image016.png&quot; alt=&quot;&quot; /&gt;. (1.3)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image017.jpg&quot; alt=&quot;Image 19&quot; /&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image018.jpg&quot; alt=&quot;Image 20&quot; /&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image019.jpg&quot; alt=&quot;Image 21&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图1. 数据拟合。左：输入的样本点；中：插值函数；右：逼近函数。&lt;/p&gt;
&lt;p&gt;无论是插值问题还是逼近问题，一个首要的问题就是函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image020.png&quot; alt=&quot;Image 22&quot; /&gt;的类型的选择和表示问题，这是《函数逼近论》中的一个比较“纠结”的问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、&lt;/strong&gt;   &lt;strong&gt;函数逼近论简介&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;函数的表示是函数逼近论中的基本问题。在数学的理论研究和实际应用中经常遇到下类问题：在选定的一类函数中寻找某个函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image020.png&quot; alt=&quot;Image 23&quot; /&gt;，使它与已知函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image021.png&quot; alt=&quot;Image 24&quot; /&gt;（或观测数据）在一定意义下为最佳近似表示，并求出用&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 25&quot; /&gt;近似表示&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image021.png&quot; alt=&quot;Image 26&quot; /&gt;而产生的误差。这就是函数逼近问题。&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 27&quot; /&gt;称为逼近函数或拟合函数。&lt;/p&gt;
&lt;p&gt;在函数逼近问题中，逼近函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 28&quot; /&gt;的函数类可以有不同的选择；即使函数类选定了，在该类函数中确定&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 29&quot; /&gt;的方式仍然是各式各样的；&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 30&quot; /&gt;对&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image021.png&quot; alt=&quot;Image 31&quot; /&gt;的近似程度（误差）也可以有各种不同的定义。我们分别对这些问题进行理解和讨论。&lt;/p&gt;
&lt;p&gt;2.1.             逼近函数类&lt;/p&gt;
&lt;p&gt;在实际问题中，首先要确定函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 32&quot; /&gt;的具体形式。这不单纯是数学问题，还与所研究问题的运动规律及观测数据有关，也与用户的经验有关。一般地，我们在某个较简单的函数类中去寻找我们所需要的函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 33&quot; /&gt;。这种函数类叫做逼近函数类。&lt;/p&gt;
&lt;p&gt;逼近函数类可以有多种选择，一般可以在不同的函数空间（比如由一些基函数通过线性组合所张成的函数空间）中进行选择。如下是一些常用的函数类。&lt;/p&gt;
&lt;p&gt;(1)   多项式函数类&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image022.png&quot; alt=&quot;Image 34&quot; /&gt;次代数多项式，即由次数不大于&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 35&quot; /&gt;的幂基&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image023.png&quot; alt=&quot;Image 36&quot; /&gt;的线性组合的多项式函数：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image024.png&quot; alt=&quot;&quot; /&gt;, (2.1)&lt;/p&gt;
&lt;p&gt;其中&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image025.png&quot; alt=&quot;Image 38&quot; /&gt;为实系数。&lt;/p&gt;
&lt;p&gt;更常用的是由&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 39&quot; /&gt;次Bernstein基函数来表达的多项式形式（称为Bernstein多项式或Bezier多项式）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image026.png&quot; alt=&quot;&quot; /&gt;, (2.2)&lt;/p&gt;
&lt;p&gt;其中Bernstein基函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image027.png&quot; alt=&quot;Image 41&quot; /&gt;&lt;/p&gt;
&lt;p&gt;(2)   三角多项式类&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 42&quot; /&gt;阶三角多项式，即由阶数不大于&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 43&quot; /&gt;的三角函数基的线性组合的三角函数：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image028.png&quot; alt=&quot;&quot; /&gt;, (2.3)&lt;/p&gt;
&lt;p&gt;其中&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image029.png&quot; alt=&quot;Image 45&quot; /&gt;为实系数。&lt;/p&gt;
&lt;p&gt;这些是常用的逼近函数类。在逼近论中，还有许多其他形式的逼近函数类，比如由代数多项式的比构成的有理分式集（有理逼近）；按照一定条件定义的样条函数集（样条逼近）；径向基函数（RBF逼近）；由正交函数系的线性组合构成的（维数固定的）函数集等。&lt;/p&gt;
&lt;p&gt;2.2.            万能逼近定理&lt;/p&gt;
&lt;p&gt;在函数逼近论中，如果一组函数成为一组“基”函数，需要满足一些比较好的性质，比如光滑性、线性无关性、权性（所有基函数和为1）、局部支集、完备性、正性、凸性等。其中， “完备性”是指，该组函数的线性组合是否能够以任意的误差和精度来逼近给定的函数（即万能逼近性质）？&lt;/p&gt;
&lt;p&gt;对于多项式函数类，我们有以下的“万能逼近定理”：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;【定理****2.1&lt;/strong&gt; **（&lt;strong&gt;&lt;strong&gt;Weierstrass&lt;/strong&gt;&lt;/strong&gt;逼近定理）】**对&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image030.png&quot; alt=&quot;Image 46&quot; /&gt;上的任意连续函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image021.png&quot; alt=&quot;Image 47&quot; /&gt;，及任意给定的&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image031.png&quot; alt=&quot;Image 48&quot; /&gt;，必存在&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 49&quot; /&gt;次代数多项式&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image024.png&quot; alt=&quot;Image 50&quot; /&gt;，使得&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image032.png&quot; alt=&quot;&quot; /&gt; (2.4)&lt;/p&gt;
&lt;p&gt;Weierstrass逼近定理表明，只要次数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 52&quot; /&gt;足够高，&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 53&quot; /&gt;次多项式就能以任何精度逼近给定的函数。具体的构造方法有Bernstein多项式或Chebyshev多项式等，这里不详细展开。&lt;/p&gt;
&lt;p&gt;类似地，由Fourier分析理论（或Weierstrass第二逼近定理），只要阶数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 54&quot; /&gt;足够高，&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 55&quot; /&gt;阶三角函数就能以任何精度逼近给定的周期函数。这些理论表明，多项式函数类和三角函数类在函数空间是“稠密”的，这就保障了用这些函数类来作为逼近函数是“合理”的。&lt;/p&gt;
&lt;p&gt;2.3.            逼近函数类选择的“纠结”&lt;/p&gt;
&lt;p&gt;在一个逼近问题中选择什么样的函数类作逼近函数类，这要取决于被逼近函数本身的特点，也和逼近问题的条件、要求等因素有关。&lt;/p&gt;
&lt;p&gt;在实际应用中，这里其实存在着两个非常“纠结”的问题。&lt;/p&gt;
&lt;p&gt;第一，选择什么样的逼近函数类？一般地，需要用户对被逼近对象或样本数据有一些“先验知识”来决定选择具体的逼近函数类。比如，如果被逼近的函数具有周期性，将三角函数作为逼近函数是个合理的选择；如果被逼近的函数具有奇点，将有理函数作为逼近函数更为合理，等等。&lt;/p&gt;
&lt;p&gt;第二，即使确定了逼近函数类，选择多高的次数或阶数？比如，如果选择了多项式函数类，根据Lagrange插值定理，一定能找到一个&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image033.png&quot; alt=&quot;Image 56&quot; /&gt;次多项式来插值给定的&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 57&quot; /&gt;个样本点。但如果&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 58&quot; /&gt;较大，则这样得到的高次多项式很容易造成“过拟合”（Overfitting）。而如果选择的&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 59&quot; /&gt;过小，则得到的多项式容易造成“欠拟合”（Underfitting）。如图2所示。过拟合或欠拟合函数在实际应用中是没有用的，因为它们的预测能力非常差！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image034.jpg&quot; alt=&quot;Image 60&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2. 用不同次数的多项式拟合样本点（蓝色点）。&lt;/p&gt;
&lt;p&gt;左：欠拟合；中：合适的拟合；右：过拟合。&lt;/p&gt;
&lt;p&gt;这里有个概念需要提及一下。一个逼近函数“表达能力”体现在该函数的未知参数（即公式(2.1)-(2.3)中的系数）与样本点个数的差，也称为“自由度”。如果逼近函数的未知参数越多，则表达能力越强。然而，在实际的拟合问题中，逼近函数的拟合能力并非越强越好。因为如果只关注样本点处的拟合误差的话，非常强的表达能力会使得样本点之外的函数值远远偏离期望的目标，反而降低拟合函数的预测性能，产生过拟合，如图2 (右)所示。&lt;/p&gt;
&lt;p&gt;人们发展出各种方法来减缓（不能完全避免）过拟合。比如，剔除样本点中的噪声（数据去噪）、增加样本点数据量（数据增广）、简化预测模型、获取额外数据进行交叉验证、或对目标函数进行适当的正则化等。在此不详细叙述。&lt;/p&gt;
&lt;p&gt;在实际应用中，如何选择拟合函数的数学模型（合适的逼近函数类及其阶数），并不是一开始就能选好，往往须通过分析确定若干模型后，再经过实际计算、比较和调整才能选到较好的模型。需要不断的试验和调试（称为“调参”过程），是个需要丰富经验的“技术活”。&lt;/p&gt;
&lt;p&gt;2.4.            最小二乘法（Least Squares Method）&lt;/p&gt;
&lt;p&gt;假设通过分析我们已经确定了逼近函数类及其次数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 61&quot; /&gt;。记基函数（一般线性无关）为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image035.png&quot; alt=&quot;Image 62&quot; /&gt;。记&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image036.png&quot; alt=&quot;Image 63&quot; /&gt;为这些基函数所张成的线性空间（函数空间）。则逼近函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 64&quot; /&gt;可记为&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image037.png&quot; alt=&quot;&quot; /&gt;, (2.5)&lt;/p&gt;
&lt;p&gt;其中&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image038.png&quot; alt=&quot;Image 66&quot; /&gt;为待定权系数。&lt;/p&gt;
&lt;p&gt;关于最小二乘法的一般提法是：对给定的一组样本点数据&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image039.png&quot; alt=&quot;Image 67&quot; /&gt;，要求在函数类&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image040.png&quot; alt=&quot;Image 68&quot; /&gt;中找一个函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 69&quot; /&gt;，使误差的&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image015.png&quot; alt=&quot;Image 70&quot; /&gt;模的平方&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image041.png&quot; alt=&quot;Image 71&quot; /&gt;，即式(1.3)，达到最小。&lt;/p&gt;
&lt;p&gt;对于分析极小化误差(1.3)，可得关于系数向量&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image042.png&quot; alt=&quot;Image 72&quot; /&gt;的法方程&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image043.png&quot; alt=&quot;&quot; /&gt;, (2.6)&lt;/p&gt;
&lt;p&gt;从而可求得&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image044.png&quot; alt=&quot;&quot; /&gt;. (2.7)&lt;/p&gt;
&lt;p&gt;由于法方程是一个线性方程组，因此基于最小二乘法的函数求解也称为线性回归。&lt;/p&gt;
&lt;p&gt;另外，我们可在误差项中加个权，表示不同点处的数据比重不同，此时称为加权最小二乘方法（Weighted least squares, WLS）。另外，还有移动最小二乘法（Moving least squares, MLS）等其他最小二乘法的改进方法。此处不详细叙述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三、&lt;/strong&gt;   &lt;strong&gt;稀疏表达和稀疏学习&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在实际应用中， 2.3节中所述的两个“纠结”问题时有发生。人们发展出不同的方法来尝试解决。&lt;/p&gt;
&lt;p&gt;3.1.            岭回归（Ridge Regression）&lt;/p&gt;
&lt;p&gt;当数据量较少的情况下，最小二乘法（线性回归）容易出现过拟合的现象，法方程的系数矩阵&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image045.png&quot; alt=&quot;Image 75&quot; /&gt;会出现奇异（非满秩），此时回归系数会变得很大，无法求解。&lt;/p&gt;
&lt;p&gt;这时在最小二乘法的结果（式(2.7)）中加一个小扰动&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image046.png&quot; alt=&quot;Image 76&quot; /&gt;，使原先无法求广义逆的情况变成可以求出其广义逆，使得问题稳定并得以求解，即&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image047.png&quot; alt=&quot;&quot; /&gt;. (3.1)&lt;/p&gt;
&lt;p&gt;事实上，这个解对应于如下极小化问题的解：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image048.png&quot; alt=&quot;&quot; /&gt;. (3.2)&lt;/p&gt;
&lt;p&gt;其中&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image049.png&quot; alt=&quot;Image 79&quot; /&gt;，参数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image050.png&quot; alt=&quot;Image 80&quot; /&gt;称为正则化参数（岭参数）。上述回归模型称为岭回归，其与最小二乘法的区别在于多了关于参数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image051.png&quot; alt=&quot;Image 81&quot; /&gt;的&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image015.png&quot; alt=&quot;Image 82&quot; /&gt;范数正则项。这一项是对&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image051.png&quot; alt=&quot;Image 83&quot; /&gt;的各个元素的总体的平衡程度，即限制这些权稀疏的方差不能太大。&lt;/p&gt;
&lt;p&gt;实际应用中，如果岭参数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image050.png&quot; alt=&quot;Image 84&quot; /&gt;选取过大，会把所有系数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image051.png&quot; alt=&quot;Image 85&quot; /&gt;均最小化（趋向于0），造成欠拟合；如果岭参数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image050.png&quot; alt=&quot;Image 86&quot; /&gt;选取过小，会导致对过拟合问题解决不当。因此岭参数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image050.png&quot; alt=&quot;Image 87&quot; /&gt;的选取也是一个技术活，需要不断调参。对于某些情形，也可以通过分析选择一个最佳的岭参数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image050.png&quot; alt=&quot;Image 88&quot; /&gt;来保证回归的效果，在此不详细叙述。&lt;/p&gt;
&lt;p&gt;3.2.            Lasso回归（Least Absolute Shrinkage and Selection Operator）&lt;/p&gt;
&lt;p&gt;Lasso回归的极小化问题为：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image052.png&quot; alt=&quot;&quot; /&gt;, (3.3)&lt;/p&gt;
&lt;p&gt;其中&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image053.png&quot; alt=&quot;Image 90&quot; /&gt;，正则项为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image054.png&quot; alt=&quot;Image 91&quot; /&gt;范数正则项。Lasso回归能够使得系数向量&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image051.png&quot; alt=&quot;Image 92&quot; /&gt;的一些元素变为0（稀疏），因此得到的拟合函数为部分基函数的线性组合。&lt;/p&gt;
&lt;p&gt;3.3.            稀疏表达与稀疏学习&lt;/p&gt;
&lt;p&gt;根据Lasso回归的分析，我们可通过对回归变量施加&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image055.png&quot; alt=&quot;Image 93&quot; /&gt;范数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image056.png&quot; alt=&quot;Image 94&quot; /&gt;（&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image055.png&quot; alt=&quot;Image 95&quot; /&gt;范数为元素中非0元素的个数，在很多时候可以用&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image054.png&quot; alt=&quot;Image 96&quot; /&gt;范数近似）的正则项，以达到对回归变量进行稀疏化，即大部分回归变量为0（少数回归变量非0）。这种优化称为稀疏优化。也就是说，对回归变量施加&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image054.png&quot; alt=&quot;Image 97&quot; /&gt;范数能够“自动”对基函数进行选择，值为0的系数所对应的基函数对最后的逼近无贡献。这些非0的基函数反映了的样本点集合的“特征”，因此也称为特征选择。&lt;/p&gt;
&lt;p&gt;通过这种方法，为了保证防止丢失一些基函数（特征），我们往往可以多选取一些基函数（甚至可以是线性相关的），使得基函数的个数比输入向量的维数还要大，称为“超完备”基（Over-complete basis）或过冗余基，在稀疏学习中亦称为“字典”。然后通过对基函数的系数进行稀疏优化，选择出合适（非0系数）的基函数的组合来表达逼近函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 98&quot; /&gt;。&lt;/p&gt;
&lt;p&gt;这在一定程度上克服了2.3节中所提出的两个“纠结”的问题。因为，这时可以选取较多的基函数及较高的次数，通过稀疏优化来选择（“学习”）合适的基元函数，也称为稀疏学习。另外，基函数（字典）和稀疏系数也可以同时通过优化学习得到，称为字典学习。&lt;/p&gt;
&lt;p&gt;对于矩阵形式（比如多元函数或图像），矩阵的稀疏表现为矩阵的低秩（近似为核模很小），则对应着矩阵低秩求解问题。在此不详细叙述。&lt;/p&gt;
&lt;p&gt;稀疏学习与最近十年来流行的压缩感知（Compressive sensing）理论与方法非常相关，也是机器学习领域的一种重要方法。其深厚的理论基础由华裔数学家陶哲轩（2006年国际数学家大会菲尔兹奖得主）、斯坦福大学统计学教授David Donoho（2018年国际数学家大会高斯奖得主）等人所建立，已成功用于信号处理、图像与视频处理、语音处理等领域。在此不详细展开介绍。&lt;/p&gt;
&lt;p&gt;近年来，笔者及其团队成功地将稀疏学习的理论和方法推广用于三维几何建模与处理中，在计算机图形学领域已发表十余篇相关论文（包括在顶级期刊ACM Transactions on Graphics上发表了4篇论文）。有兴趣的读者可详细查看&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu/&quot;&gt;笔者的相关论文&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;[3-1] Xu et al. Survey on Sparsity in Geometry Modeling and Processing. Graphical Models, 82, 160-180, 2015. （三维几何处理的稀疏优化方法的综述论文）&lt;/p&gt;
&lt;p&gt;[3-2] Wang et al. Construction of Manifolds via Compatible Sparse Representations. ACM Transactions on Graphics, 35(2), Article 14: 1-10, 2016. （基于基函数稀疏选择的曲面生成）&lt;/p&gt;
&lt;p&gt;[3-3] Xiong et al. Robust Surface Reconstruction via Dictionary Learning. ACM Transactions on Graphics (Proc. Siggraph Asia), 33(6), Article 1: 1-12, 2014. （基于字典学习的曲面重建）&lt;/p&gt;
&lt;p&gt;[3-4] Zhang et al. Local Barycentric Coordinates. ACM Transactions on Graphics (Proc. Siggraph Asia), 33(6), Article 1: 1-12, 2014. （基于稀疏优化的局部重心坐标）&lt;/p&gt;
&lt;p&gt;[3-5] Hu et al. Co-Segmentation of 3D Shapes via Subspace Clustering. Computer Graphics Forum (Proc. Symposium on Geometry Processing), 31(5): 1703-1713, 2012. （基于特征稀疏选择的三维形状共同分割）&lt;/p&gt;
&lt;p&gt;[3-6] Jin et al. Unsupervised Upright Orientation of Man-Made Models. Graphical Models (Proc. GMP), 74(4): 99-108, 2012. （基于矩阵低秩优化的三维形状正向计算）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image057.jpg&quot; alt=&quot;Image 99&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图3. 稀疏学习方法用于三维几何的建模与处理（笔者的工作）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;四、&lt;/strong&gt;   &lt;strong&gt;高维的逼近函数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;上面讨论了映射&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image003.png&quot; alt=&quot;Image 100&quot; /&gt;为一元函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image006.png&quot; alt=&quot;Image 101&quot; /&gt;的情形。上述的有关概念和方法同样可以推广至多元函数（&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image058.png&quot; alt=&quot;Image 102&quot; /&gt;）及向量值函数（&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image059.png&quot; alt=&quot;Image 103&quot; /&gt;）的情形（如图4）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image060.jpg&quot; alt=&quot;Image 104&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图4. 不同情形（维数）的逼近函数。&lt;/p&gt;
&lt;p&gt;左上：一元函数；右上：多元函数；左下：一元向量值函数；右下：多元向量值函数。&lt;/p&gt;
&lt;p&gt;4.1.            多元函数&lt;/p&gt;
&lt;p&gt;假设有多元函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image061.png&quot; alt=&quot;Image 105&quot; /&gt;，即&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image062.png&quot; alt=&quot;Image 106&quot; /&gt;，的一组测量样本数据&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image063.png&quot; alt=&quot;Image 107&quot; /&gt;。设&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image064.png&quot; alt=&quot;Image 108&quot; /&gt;中的一组基函数为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image065.png&quot; alt=&quot;Image 109&quot; /&gt;。要求函数&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image066.png&quot; alt=&quot;&quot; /&gt;, (4.1)&lt;/p&gt;
&lt;p&gt;使得误差&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image067.png&quot; alt=&quot;&quot; /&gt; (4.2)&lt;/p&gt;
&lt;p&gt;的平方和最小。这与式(1.3)和2.4节的极值问题完全一样。系数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image068.png&quot; alt=&quot;Image 112&quot; /&gt;, 同样通过求解法方程得到。上述过程称为多元函数的最小二乘拟合。&lt;/p&gt;
&lt;p&gt;在函数论中，高维空间&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image064.png&quot; alt=&quot;Image 113&quot; /&gt;中的基函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image065.png&quot; alt=&quot;Image 114&quot; /&gt;的构造也有许多方法。为了简便，在许多时候我们采用张量积形式的基函数，即每个基函数是各个维数的一元基函数的乘积形式。在计算机图形学和计算机辅助几何设计（CG&amp;amp;CAGD）领域经常采用。&lt;/p&gt;
&lt;p&gt;4.2.            向量值函数&lt;/p&gt;
&lt;p&gt;如果因变量有多个，即&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image059.png&quot; alt=&quot;Image 115&quot; /&gt;，称为向量值函数。比如空间螺旋线的参数方程&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image069.png&quot; alt=&quot;&quot; /&gt; (4.3)&lt;/p&gt;
&lt;p&gt;就是一个从一维到三维的向量值函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image070.png&quot; alt=&quot;Image 117&quot; /&gt;。如果自变量的维数比应变量的维数低，则自变量可看作为应变量的参数。在式(4.3)中，变量&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image071.png&quot; alt=&quot;Image 118&quot; /&gt;可看作为该螺旋线的参数。&lt;/p&gt;
&lt;p&gt;对于向量值函数，可以看成是多个一元函数或多元函数（一般共享基函数）即可，所有处理方法（包括最小二乘法）都是对每个函数分别操作的，与前面单个函数的处理方法完全一样。如果用数学方式来表达，前面的很多符号由向量变为矩阵的形式而已。详细可查看《数学分析》。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;五、&lt;/strong&gt;   &lt;strong&gt;参数曲线曲面拟合&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;前面讨论的函数所能表达的曲线比较简单，无法表达封闭和多值的曲线。因此，在计算机图形学和计算机辅助几何设计中常用参数曲线曲面（本质是向量值函数，见4.2节）来表达几何形状，用于几何造型。另外，在计算机图形学中还有一种利用隐函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image072.png&quot; alt=&quot;Image 119&quot; /&gt;来表达曲线的方式，也常用于造型中，这里不展开介绍。&lt;/p&gt;
&lt;p&gt;5.1.            二维参数曲线&lt;/p&gt;
&lt;p&gt;从数学来看，一条曲线的本征维度是一维的，不论是从哪个维度的空间来看。从直观来看，该曲线能被“拉”成为一条直线或线段；即，一条有端点的曲线能和一条线段建立1-1对应，如图5（左）所示。因此，嵌入到二维空间中的曲线可由单个参数来表达，即有如下形式的参数形式：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image073.png&quot; alt=&quot;&quot; /&gt; (5.1)&lt;/p&gt;
&lt;p&gt;其中&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image071.png&quot; alt=&quot;Image 121&quot; /&gt;为该曲线的参数，&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image074.png&quot; alt=&quot;Image 122&quot; /&gt;, &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image075.png&quot; alt=&quot;Image 123&quot; /&gt;均为&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image071.png&quot; alt=&quot;Image 124&quot; /&gt;的函数，分别表示曲线上对应于参数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image071.png&quot; alt=&quot;Image 125&quot; /&gt;的点的两个坐标分量。一般参数曲线表达为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image076.png&quot; alt=&quot;Image 126&quot; /&gt;。本质上，这是一个从&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image004.png&quot; alt=&quot;Image 127&quot; /&gt;到&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image077.png&quot; alt=&quot;Image 128&quot; /&gt;的向量值函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image078.png&quot; alt=&quot;Image 129&quot; /&gt;。&lt;/p&gt;
&lt;p&gt;5.2.            三维参数曲面&lt;/p&gt;
&lt;p&gt;类似地，一张二维流形曲面的本征维度是二维的。一张曲面能与平面上的一块区域建立1-1对应，如图5（右）所示。因此，嵌入到三维空间中的曲面可由两个参数来表达，即有如下形式的参数形式：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image079.png&quot; alt=&quot;&quot; /&gt; (5.2)&lt;/p&gt;
&lt;p&gt;其中&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image080.png&quot; alt=&quot;Image 131&quot; /&gt;为该曲面的参数，&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image081.png&quot; alt=&quot;Image 132&quot; /&gt;, &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image082.png&quot; alt=&quot;Image 133&quot; /&gt;均为&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image080.png&quot; alt=&quot;Image 134&quot; /&gt;的二元函数，分别表示曲面上对应于参数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image080.png&quot; alt=&quot;Image 135&quot; /&gt;的点的三个坐标分量。一般参数曲面表达为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image083.png&quot; alt=&quot;Image 136&quot; /&gt;。本质上，这是一个从&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image077.png&quot; alt=&quot;Image 137&quot; /&gt;到&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image084.png&quot; alt=&quot;Image 138&quot; /&gt;的向量值函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image085.png&quot; alt=&quot;Image 139&quot; /&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image086.jpg&quot; alt=&quot;Image 140&quot; /&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image087.jpg&quot; alt=&quot;Image 141&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图5. 参数曲线曲面。左：单参数曲线；右：双参数曲面。&lt;/p&gt;
&lt;p&gt;5.3.            参数曲线曲面拟合&lt;/p&gt;
&lt;p&gt;下面我们介绍如何使用参数曲线来拟合2D平面上的一组有序样本点。&lt;/p&gt;
&lt;p&gt;参数曲线拟合的问题描述如下：给定平面上一组有序样本点&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image088.png&quot; alt=&quot;Image 142&quot; /&gt;，我们希望寻求一条拟合这些点的参数曲线关系&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image076.png&quot; alt=&quot;Image 143&quot; /&gt;。&lt;/p&gt;
&lt;p&gt;如需决定一条拟合曲线，首先需要确定每个样本点&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image089.png&quot; alt=&quot;Image 144&quot; /&gt;所对应的参数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image090.png&quot; alt=&quot;Image 145&quot; /&gt;。对于一组有序的样本点，所确定的一种参数分割，称之为这组样本点的参数化。参数化的本质就是找一组恰当的参数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image090.png&quot; alt=&quot;Image 146&quot; /&gt;来匹配这一组样本点，以便使这条拟合出来的曲线美观、合理。&lt;/p&gt;
&lt;p&gt;在参数曲线拟合中，样本点的参数化是个非常基本而重要的问题。不同的参数化，对拟合曲线的形状会产生很大的影响。图6显示了三种参数化（均匀参数化、弦长参数化和中心参数化）对拟合曲线形状的影响。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image091.jpg&quot; alt=&quot;Image 147&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图6. 不同的参数化导致不同的参数曲线拟合结果。&lt;/p&gt;
&lt;p&gt;类似地，如果利用参数曲面来拟合&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image084.png&quot; alt=&quot;Image 148&quot; /&gt;空间中给定的一组样本点，首先也需要确定这些样本点在&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image077.png&quot; alt=&quot;Image 149&quot; /&gt;平面上的参数化，如图7所示。在曲面参数化中，不仅需要建立样本点及其参数的一一对应，我们还希望参数区域的网格保持原始网格的一些重要的几何特性，比如角度、边长等。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image092.jpg&quot; alt=&quot;Image 150&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图7. 三维曲面的参数化。&lt;/p&gt;
&lt;p&gt;曲面参数化是计算机图形学中非常基础且重要的一个研究课题，也一直是研究热点之一。笔者及所在的课题组也在这个课题方面作了大量的工作，有兴趣的读者可详细查看&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu/&quot;&gt;笔者的相关论文&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;（平面参数化）&lt;/p&gt;
&lt;p&gt;[5-1] Ligang Liu, Lei Zhang, Yin Xu, Craig Gotsman, Steven J. Gortler.  A Local/Global Approach to Mesh Parameterization. Computer Graphics Forum (Proc. Eurographics Symposium on Geometry Processing (SGP)), 27(5), 1495-1504, 2008.&lt;/p&gt;
&lt;p&gt;[5-2] Ligang Liu, Chunyang Ye, Ruiqi Ni, Xiao-Ming Fu. Progressive Parameterizations.  ACM Transactions on Graphics (Proc. Siggraph), 37(4), Article 41: 1-12, 2018.&lt;/p&gt;
&lt;p&gt;（球面参数化）&lt;/p&gt;
&lt;p&gt;[5-3] Xin Hu, Xiao-Ming Fu, Ligang Liu. Advanced Hierarchical Spherical Parameterizations. IEEE Transactions on Visualization and Computer Graphics, to appear, 2018.&lt;/p&gt;
&lt;p&gt;[5-4] Chunxue Wang, Xin Hu, Xiaoming Fu, Ligang Liu. Bijective Spherical Parametrization with Low Distortion. Computers&amp;amp;Graphics (Proc. SMI), 58: 161-171, 2016.&lt;/p&gt;
&lt;p&gt;[5-5] Chunxue Wang, Zheng Liu, Ligang Liu. As-Rigid-As-Possible Spherical Parameterization. Graphical Models (Proc. GMP), 76(5): 457-467, 2014.&lt;/p&gt;
&lt;p&gt;（流形参数化）&lt;/p&gt;
&lt;p&gt;[5-6] Lei Zhang, Ligang Liu, Zhongping Ji, Guojin Wang. Manifold Parameterization. Lecture Notes in Computer Science (Proc. Computer Graphics International), 4035, 160-171, 2006.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;六、&lt;/strong&gt;   &lt;strong&gt;从人工神经网络的观点来看拟合函数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了讲清楚人工神经网络（Artificial Neural Network，ANN），下面我们先从神经网络的观点来看传统的拟合函数和曲线曲面。&lt;/p&gt;
&lt;p&gt;6.1.            一元函数&lt;/p&gt;
&lt;p&gt;对于一元的逼近函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image006.png&quot; alt=&quot;Image 151&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image037.png&quot; alt=&quot;&quot; /&gt;. (6.1)&lt;/p&gt;
&lt;p&gt;可以看成为如图8的三层神经网络，其中只有一个隐层。隐层上有&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 153&quot; /&gt;个节点，激活函数分别为基函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image093.png&quot; alt=&quot;Image 154&quot; /&gt;（从这里我们将基函数称为“激活函数”）。输入层到隐层的权设为常值1（图8左），也可以看成为将输入层的值“直接代入”（不做任何变换，用虚线表示）到激活函数（图8右）。隐层到输出层的权为基函数的组合系数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image094.png&quot; alt=&quot;Image 155&quot; /&gt;。&lt;/p&gt;
&lt;p&gt;中间隐层的输出节点所形成的向量&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image095.png&quot; alt=&quot;Image 156&quot; /&gt;可看作为输入量的“特征”。&lt;/p&gt;
&lt;p&gt;现在我们开始用机器学习的语言来描述数据拟合的过程。整个神经网络就是由中间节点的激活函数及权系数所决定的一个函数(6.1)。我们称样本点&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image008.png&quot; alt=&quot;Image 157&quot; /&gt;, 为训练数据（Training set），称函数在训练数据上的误差度量为损失函数（Loss function）。通过训练数据来极小化损失函数得到权系数的过程称为“训练”或“学习”。如果损失函数取为(1.3)的形式，则网络的训练过程本质上就是前面所讲的最小二乘法（2.4节）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image096.jpg&quot; alt=&quot;Image 158&quot; /&gt;     &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image097.jpg&quot; alt=&quot;Image 159&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图8. 一元逼近函数的神经网络。左：输入层到隐层的权系数均为常值1；&lt;/p&gt;
&lt;p&gt;右：输入层到隐层看成为“直接代入”（用虚线表示）。&lt;/p&gt;
&lt;p&gt;6.2.            多元函数和向量值函数&lt;/p&gt;
&lt;p&gt;考虑一般的逼近函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image098.png&quot; alt=&quot;Image 160&quot; /&gt;。设&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image064.png&quot; alt=&quot;Image 161&quot; /&gt;中的一组基函数为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image065.png&quot; alt=&quot;Image 162&quot; /&gt;。则函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 163&quot; /&gt;可看成为如下图的一个三层的神经网络。注意这里隐层的激活函数都是&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image007.png&quot; alt=&quot;Image 164&quot; /&gt;维函数，从输入层到隐层也是直接代入。输出层的各个分量&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image099.png&quot; alt=&quot;Image 165&quot; /&gt;共享隐层的激活函数。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image100.jpg&quot; alt=&quot;Image 166&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图9. 多元函数和向量值函数的神经网络。从输入层到隐层是变量直接代入到激活函数。&lt;/p&gt;
&lt;p&gt;6.3.            拟合曲线曲面&lt;/p&gt;
&lt;p&gt;拟合曲线可以看作为一个多层的神经网络，如下图所示。输入层（样本点）到参数化是一个变换，可看成为一个神经网络；参数化到输出层是一个变换（单变量基函数组合），也是一个神经网络。输出层的两个分量共享基函数。&lt;/p&gt;
&lt;p&gt;隐层1的激活函数为双变量基函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image101.png&quot; alt=&quot;Image 167&quot; /&gt;；隐层3的激活函数为单变量基函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image102.png&quot; alt=&quot;Image 168&quot; /&gt;。中间隐层（隐层1、2、3）的输出节点所形成的向量均可分别看作为输入量在不同维数空间的“特征”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image103.jpg&quot; alt=&quot;Image 169&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图10. 拟合曲线的神经网络。输入层（样本点）到参数化是一个神经网络变换；&lt;/p&gt;
&lt;p&gt;参数化到输出层是一个神经网络变换。&lt;/p&gt;
&lt;p&gt;类似地，拟合曲面也可以看作为一个如下图的多层神经网络。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image104.jpg&quot; alt=&quot;Image 170&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图11. 拟合曲面的神经网络。&lt;/p&gt;
&lt;p&gt;从曲线曲面拟合的过程及神经网络结构来看，如果将整个网络进行优化，则拟合的过程是寻求样本点的参数化以及表达函数的基函数，使得拟合误差极小化。在这里，我们是知道给定样本点的“本征维数”，因此，人为设置了第一个隐层的维数为1（曲线）或2（曲面）。然而，在实际应用中，我们并不知道数据的本征维数，此时需要利用其他方法（比如流形学习或降维方法）来“检测”或“猜测”隐层的维数，或者直接根据经验来不断调参和测试。&lt;/p&gt;
&lt;p&gt;需要提及的是，在计算机图形学中，传统的大部分方法是将参数化的问题和曲线曲面拟合问题分为两个问题来解决。有些工作专门做参数化，有些工作专门研究拟合问题。其中参数化的工作更为重要，直接决定了拟合曲线曲面的质量。此处不详述。&lt;/p&gt;
&lt;p&gt;需要注意的是，本节只是从神经网络的观点来看曲线曲面的参数化和拟合的问题。在计算机图形学中，我们不是简单的通过上述网络来求参数化（单个样本点），而是要考虑更多的样本点一起来求解参数化。这个后面还会详细介绍。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;七、&lt;/strong&gt;   &lt;strong&gt;通用人工神经网络&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有了上述的理解，我们现在来理解人工神经网络就非常容易了。&lt;/p&gt;
&lt;p&gt;7.1.            函数拟合回顾&lt;/p&gt;
&lt;p&gt;回顾前面所述的函数逼近论中的函数拟合问题，始终是存在着两个“纠结”。一是选择什么样的逼近函数类，即选择什么类型的基函数？二是选择多高的次数或阶数？&lt;/p&gt;
&lt;p&gt;另一方面，如果从图8或图9的神经网络的观点来看，网络的结构设置都存在着如下两个“纠结”：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt; 隐层中的节点中使用什么样的激活函数（基函数）？
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt; 隐层中设置多少个节点（基函数的次数）？
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在传统逼近论中，上述两个问题就没有好方法来解决（第一个问题针对具体问题可预先设定），是通过不断试错来看结果的好坏来决定的。这是因为，虽然有些基函数的性质很好，但是次数或阶数过高（比如多项式基或三角函数基），就会产生震荡，也容易产生过拟合，使得拟合函数的性态不好。因此，一般不会采用次数或结束太高的基函数。为此，人们发展了分段拟合方法，即将数据分为若干段，每段分别拟合，各段的拟合函数保证一定的光滑性，称为样条函数。在逼近论和计算机图形学领域，人们发展出了很多漂亮的样条的理论与方法。&lt;/p&gt;
&lt;p&gt;对于参数类型的高维曲线曲面，还存在着参数化的问题，这时还存在另一个纠结，就是要设置多少个隐层（图10和图11）？&lt;/p&gt;
&lt;p&gt;7.2.            使用简单元函数作为激活函数&lt;/p&gt;
&lt;p&gt;为了克服上述两个纠结的问题，是否可以通过其他形式来生成“基函数”？注意到，对于任意一个非常值的一元函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image105.png&quot; alt=&quot;Image 171&quot; /&gt;，这里我们称为元函数，其沿着&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image106.png&quot; alt=&quot;Image 172&quot; /&gt;方向的平移函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image107.png&quot; alt=&quot;Image 173&quot; /&gt;以及沿着&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image106.png&quot; alt=&quot;Image 174&quot; /&gt;方向的伸缩函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image108.png&quot; alt=&quot;Image 175&quot; /&gt;都与原函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image109.png&quot; alt=&quot;Image 176&quot; /&gt;线性无关。也就是说，如果能有足够多的变换所生成的函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image110.png&quot; alt=&quot;Image 177&quot; /&gt;，其线性组合所张成的函数空间就能有充分的表达能力。那么这些函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image111.png&quot; alt=&quot;Image 178&quot; /&gt;（可能都线性无关）是否能构成逼近一般函数的“基函数”呢？&lt;/p&gt;
&lt;p&gt;一个自然的想法就是，我们能否以这个&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image105.png&quot; alt=&quot;Image 179&quot; /&gt;作为激活函数，让网络自动地去学习这些激活函数的变换&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image112.png&quot; alt=&quot;Image 180&quot; /&gt;，或者说去学习一些“基函数”，来表达所需要的拟合函数呢？这就是图12所示的神经元。变量&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image106.png&quot; alt=&quot;Image 181&quot; /&gt;乘以一个伸缩，加上一个平移（称为偏置“bias”），即变量的仿射变换，成为神经元的输入&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image113.png&quot; alt=&quot;Image 182&quot; /&gt;；然后通过激活函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image114.png&quot; alt=&quot;Image 183&quot; /&gt;复合后成为该神经元的输出&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image115.png&quot; alt=&quot;Image 184&quot; /&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image116.jpg&quot; alt=&quot;Image 185&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图12. 一元（单变量）函数的神经元结构。&lt;/p&gt;
&lt;p&gt;对于多变量的情形（多元函数），神经元的结构如图13所示。变量&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image117.png&quot; alt=&quot;Image 186&quot; /&gt;的线性组合，加上一个平移（称为偏置“bias”），即变量的仿射变换，成为神经元的输入&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image118.png&quot; alt=&quot;Image 187&quot; /&gt;；然后通过激活函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image114.png&quot; alt=&quot;Image 188&quot; /&gt;复合后成为该神经元的输出&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image115.png&quot; alt=&quot;Image 189&quot; /&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image119.jpg&quot; alt=&quot;Image 190&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图13. 多元（多变量）函数的神经元结构。&lt;/p&gt;
&lt;p&gt;不失一般性，我们下面就直接以多元函数的形式来介绍一般神经网络的结构。对于向量值函数（&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image120.png&quot; alt=&quot;Image 191&quot; /&gt;是多维的），则分别将&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image120.png&quot; alt=&quot;Image 192&quot; /&gt;的各个维数分别看作一个多元函数处理而已，这些函数共享节点（基函数）即可。&lt;/p&gt;
&lt;p&gt;7.3.            单隐层神经网络&lt;/p&gt;
&lt;p&gt;一个多元函数的神经网络的结构如图14所示，有一个输入层，一个隐层及一个输出层。输入层除了变量&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image117.png&quot; alt=&quot;Image 193&quot; /&gt;外，还有一个常数节点1；隐层包含多个节点，每个节点的激活函数都是&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image114.png&quot; alt=&quot;Image 194&quot; /&gt;，隐层的输出就是输入层节点的线性组合加偏置（即仿射变换）&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image121.png&quot; alt=&quot;Image 195&quot; /&gt;代入到激活函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image114.png&quot; alt=&quot;Image 196&quot; /&gt;的复合函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image122.png&quot; alt=&quot;Image 197&quot; /&gt;；输出层是这些复合函数的组合&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image123.png&quot; alt=&quot;Image 198&quot; /&gt;。&lt;/p&gt;
&lt;p&gt;这个网络的所有权系数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image124.png&quot; alt=&quot;Image 199&quot; /&gt;，&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image125.png&quot; alt=&quot;Image 200&quot; /&gt;（输入层与隐层之间的权及偏置项）及&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image126.png&quot; alt=&quot;Image 201&quot; /&gt;（隐层与输出层之间的权，此层一般不用偏置项）作为这个神经网络的参数变量，需要通过极小化损失函数来求解的。这个过程称为“训练”或“学习”。&lt;/p&gt;
&lt;p&gt;与前面所述的逼近论中的拟合函数类似，网络的隐层的节点数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 202&quot; /&gt;是需要通过不断调试和尝试来确定的。隐层的节点输出&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image127.png&quot; alt=&quot;Image 203&quot; /&gt;称为输入数据&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image128.png&quot; alt=&quot;Image 204&quot; /&gt;)的“特征”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image129.jpg&quot; alt=&quot;Image 205&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图14. 多元（多变量）函数的单隐层神经网络结构。&lt;/p&gt;
&lt;p&gt;整个网络的学习过程本质上就是在学习所有的系数参数。最后得到的拟合函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image123.png&quot; alt=&quot;Image 206&quot; /&gt;为一些函数的线性组合表达。这些组合函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image130.png&quot; alt=&quot;Image 207&quot; /&gt;实质上就是表达函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image131.png&quot; alt=&quot;Image 208&quot; /&gt;的“基函数”！&lt;/p&gt;
&lt;p&gt;从函数逼近论的角度，我们可以这样来理解神经网络：神经网络的学习过程本质上是在学习基函数！这些基函数是通过激活函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image114.png&quot; alt=&quot;Image 209&quot; /&gt;通过平移和伸缩（变量的仿射变换）来得到的！&lt;/p&gt;
&lt;p&gt;当然，天下没有免费的午餐。以前函数逼近论无法解决的两个“纠结”这里仍然存在：&lt;/p&gt;
&lt;p&gt;第一个纠结是如何选取基函数？这里使用激活函数，然后学习其变换来得到。&lt;/p&gt;
&lt;p&gt;第二个纠结是选择多少个基函数？这里为隐层的神经元个数。&lt;/p&gt;
&lt;p&gt;从这个观点来看，神经网络本质上就是传统的逼近论中的逼近函数的一种推广。它不是通过指定的理论完备的基函数来表达函数的，而是通过简单的基元函数（激活函数）的不断变换得到的“基函数”来表达函数的。实质上是二层复合函数。&lt;/p&gt;
&lt;p&gt;此时，我们当然要问个问题：将函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image105.png&quot; alt=&quot;Image 210&quot; /&gt;经过充分多的平移和伸缩（包括它们的组合&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image132.png&quot; alt=&quot;Image 211&quot; /&gt;）所线性张成的函数空间，其表达能力有多强？这个函数空间是否在所有函数空间是稠密的？如果问题是正确的，那么就是说，对于任何一个给定的函数，总能找到函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image105.png&quot; alt=&quot;Image 212&quot; /&gt;的多次平移和缩放的函数，其线性组合能够逼近给定的这个函数；也就是说，图14中的神经网络只要隐层的节点数足够多，该网络所表达的函数就能逼近任意的函数。&lt;/p&gt;
&lt;p&gt;幸运的是，上述猜想在很多情况下是成立的！有以下的万能逼近定理所保证。&lt;/p&gt;
&lt;p&gt;7.4.            万能逼近定理&lt;/p&gt;
&lt;p&gt;记&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image133.png&quot; alt=&quot;Image 213&quot; /&gt;为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image064.png&quot; alt=&quot;Image 214&quot; /&gt;空间中的单位立方体，我们在这个定义域中来描述万能逼近定理。记&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image134.png&quot; alt=&quot;Image 215&quot; /&gt;为&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image135.png&quot; alt=&quot;Image 216&quot; /&gt;上的连续函数空间，&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image136.png&quot; alt=&quot;Image 217&quot; /&gt;为&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image135.png&quot; alt=&quot;Image 218&quot; /&gt;上的可测函数空间，&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image137.png&quot; alt=&quot;Image 219&quot; /&gt;为&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image135.png&quot; alt=&quot;Image 220&quot; /&gt;上相对测度&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image138.png&quot; alt=&quot;Image 221&quot; /&gt;的可积函数空间（即&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image139.png&quot; alt=&quot;Image 222&quot; /&gt;）。&lt;/p&gt;
&lt;p&gt;设给定一元激活函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image140.png&quot; alt=&quot;Image 223&quot; /&gt;，首先给出如下定义。&lt;/p&gt;
&lt;p&gt;【定义7.1】称函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image141.png&quot; alt=&quot;Image 224&quot; /&gt;为压缩函数，如果&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image141.png&quot; alt=&quot;Image 225&quot; /&gt;单调不减，且满足&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image142.png&quot; alt=&quot;Image 226&quot; /&gt;, &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image143.png&quot; alt=&quot;Image 227&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;【定义7.2】称函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image141.png&quot; alt=&quot;Image 228&quot; /&gt;为可分辨的，若对于有限测度&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image138.png&quot; alt=&quot;Image 229&quot; /&gt;，由&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image144.png&quot; alt=&quot;Image 230&quot; /&gt;,&lt;/p&gt;
&lt;p&gt;可得到&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image145.png&quot; alt=&quot;Image 231&quot; /&gt;&lt;/p&gt;
&lt;p&gt;【定义7.3】记&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image146.png&quot; alt=&quot;Image 232&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为所有由激活函数变换及线性累加所构成的&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image007.png&quot; alt=&quot;Image 233&quot; /&gt;维函数空间（即具有&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 234&quot; /&gt;个节点的单隐层神经网络所表达的&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image007.png&quot; alt=&quot;Image 235&quot; /&gt;维函数）。&lt;/p&gt;
&lt;p&gt;【定理7.1】若&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image147.png&quot; alt=&quot;Image 236&quot; /&gt;是压缩函数，则&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image148.png&quot; alt=&quot;Image 237&quot; /&gt;在&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image134.png&quot; alt=&quot;Image 238&quot; /&gt;中一致稠密，在&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image136.png&quot; alt=&quot;Image 239&quot; /&gt;中按如下距离&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image149.png&quot; alt=&quot;Image 240&quot; /&gt;下稠密：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image150.png&quot; alt=&quot;Image 241&quot; /&gt;.&lt;/p&gt;
&lt;p&gt;【定理7.2】若&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image147.png&quot; alt=&quot;Image 242&quot; /&gt;是可分辨的，则&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image148.png&quot; alt=&quot;Image 243&quot; /&gt;在&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image134.png&quot; alt=&quot;Image 244&quot; /&gt;中按连续函数距离下稠密。&lt;/p&gt;
&lt;p&gt;【定理7.3】若&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image147.png&quot; alt=&quot;Image 245&quot; /&gt;是连续有界的非常值函数，则&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image148.png&quot; alt=&quot;Image 246&quot; /&gt;在&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image134.png&quot; alt=&quot;Image 247&quot; /&gt;中稠密。&lt;/p&gt;
&lt;p&gt;【定理7.4】若&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image147.png&quot; alt=&quot;Image 248&quot; /&gt;是无界的非常值函数，则&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image148.png&quot; alt=&quot;Image 249&quot; /&gt;在&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image137.png&quot; alt=&quot;Image 250&quot; /&gt;中稠密。&lt;/p&gt;
&lt;p&gt;上述定理这里就不详细解释，稍微有些实分析和泛函分析的基础就能看懂。用通俗的话来说，就是：对任意给定的一个&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image064.png&quot; alt=&quot;Image 251&quot; /&gt;中的函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image021.png&quot; alt=&quot;Image 252&quot; /&gt;，只要项数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image022.png&quot; alt=&quot;Image 253&quot; /&gt;足够多，&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image148.png&quot; alt=&quot;Image 254&quot; /&gt;中就存在一个函数&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 255&quot; /&gt;，使得&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image020.png&quot; alt=&quot;Image 256&quot; /&gt;在一定精度下逼近&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image021.png&quot; alt=&quot;Image 257&quot; /&gt;。也就是说，图14所表达的单隐层的神经网络所表达的&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image007.png&quot; alt=&quot;Image 258&quot; /&gt;维函数能够逼近&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image064.png&quot; alt=&quot;Image 259&quot; /&gt;中的任意一个函数。&lt;/p&gt;
&lt;p&gt;根据上述定理可知，函数&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image147.png&quot; alt=&quot;Image 260&quot; /&gt;只要满足一定条件即可作为一个合适的激活函数。但还是存在着一个巨大的“纠结”，就是隐层中的节点数量该取多大，仍是未知的。在实际中，这个是要不断通过测试和调试来决定的，这个过程称为“调参”。&lt;/p&gt;
&lt;p&gt;定理7.1-7.4的详细证明可见以下论文。&lt;/p&gt;
&lt;p&gt;[7-1] K. Hornik, et al. Multilayer feedforward networks are universal approximations. Neural Networks, 2: 359-366, 1989.&lt;/p&gt;
&lt;p&gt;[7-2] G. Cybenko. Approximation by superpositions of a sigmoidal function. Math. Control Signals System, 2: 303-314, 1989.&lt;/p&gt;
&lt;p&gt;[7-3] K. Hornik. Approximation capabilities of multilayer feedforward networks. Neural Networks, 4: 251-257, 1991.&lt;/p&gt;
&lt;p&gt;7.5.            深度神经网络：多隐层神经网络&lt;/p&gt;
&lt;p&gt;将上述的神经网络的隐层进一步推广到多层，即可得到多隐层的神经网络，即深度神经网络（深度的意思就是多层）。其网络结构如图15所示。&lt;/p&gt;
&lt;p&gt;由于每相邻的两层的节点都是全部连接的，因此在机器学习领域，也叫做全连接神经网络或多层感知机（Multi-Layer Perceptron, MLP）。&lt;/p&gt;
&lt;p&gt;图15只是显示了&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image151.png&quot; alt=&quot;Image 261&quot; /&gt;的函数的神经网络的结构。对于一般的&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image152.png&quot; alt=&quot;Image 262&quot; /&gt;的向量值函数，只要将最后输出层多几个节点即可，即，每个维度分量都是一个&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image151.png&quot; alt=&quot;Image 263&quot; /&gt;的函数，共享了前面的所有网络层结构。&lt;/p&gt;
&lt;p&gt;每个隐层的输出&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image153.png&quot; alt=&quot;Image 264&quot; /&gt; 都可以看成输入数据&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image154.png&quot; alt=&quot;Image 265&quot; /&gt;在不同维数空间&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image155.png&quot; alt=&quot;Image 266&quot; /&gt;下的 “特征”。&lt;/p&gt;
&lt;p&gt;注意不要在输出层使用激活函数。因为最后的输出就是那些基函数的线性组合表达即可。&lt;/p&gt;
&lt;p&gt;从数学形式上看，深度神经网络就是一个多层复合函数。可以证明（Kolmogorov–Arnold表示定理），任意一个多元函数可以表示成若干个单变量函数的复合（事实上，只需要三层网络即可）。这为使用深度神经网络用来逼近任意高维函数提供了理论基础。但遗憾的是，该定理只证明了复合函数逼近任意函数的存在性，但具体使用什么样的函数未可知。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image156.jpg&quot; alt=&quot;Image 267&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图15. 多元（多变量）函数的深度神经网络结构。&lt;/p&gt;
&lt;p&gt;因此，深度神经网络也能很强地表达&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image064.png&quot; alt=&quot;Image 268&quot; /&gt;中的任意的函数。但在具体应用中，选用多少个隐层，每一隐层选用多少节点，这些都是需要根据损失函数的进行不断调试的。这个过程也称为“调参”。另外，从这个观点可以容易理解各种深度神经网络的工作机制，包括一般深度神经网络、卷积神经网络（CNN）、RBF神经网络、ELM等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;八、&lt;/strong&gt;   &lt;strong&gt;深入理解深度神经网络&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;8.1.            激活函数&lt;/p&gt;
&lt;p&gt;由7.4节中的万能逼近定理可知，激活函数的选择可以很多种。常用的激活函数如图16所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image157.jpg&quot; alt=&quot;Image 269&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图16. 常用的激活函数。&lt;/p&gt;
&lt;p&gt;在早期，Sigmoid函数和tanh函数是人们经常使用的激活函数。近年来，随着神经网络的隐层不断增加后，人们偏向于使用ReLU函数作为激活函数，这是因为ReLU函数的在x轴正向的导数是1，不容易产生梯度消失问题（见8.3节）。这里值得一提的是，如果使用ReLU函数作为激活函数，则最后生成的拟合函数为分片线性函数。&lt;/p&gt;
&lt;p&gt;关于激活函数的理解和讨论，机器学习领域及互联网上有很多文章进行过解释，都是解释为“激活函数的主要作用是提供网络的非线性建模能力，提供了分层的非线性映射学习能力”等等。我们从逼近论的角度，将非线性激活函数理解为拟合函数的“基函数”生成器（如果激活函数为线性的，则无法生成表达非线性函数的基！），训练神经网络就是在学习这些基函数，这是一种全新的观点，也是非常容易理解的。&lt;/p&gt;
&lt;p&gt;8.2.            反向传播算法（BP优化算法）&lt;/p&gt;
&lt;p&gt;从数学上看，深度神经网络就是一个多层复合函数。在机器学习中，这个复合函数的好坏依赖于对目标函数最大化或者最小化的过程，我们常常把最小化的目标函数称为损失函数（Loss function），它主要用于衡量机器学习模型（此处为深度神经网络）的预测能力。常见的损失函数有均方误差（L2误差）、平均绝对误差（L1误差）、分位数损失、交叉熵、对比损失等。损失函数的选取依赖于参数的数量、异常值、机器学习算法、梯度下降的效率、导数求取的难易和预测的置信度等若干方面。这里就不展开讨论。&lt;/p&gt;
&lt;p&gt;给定了一批训练数据，计算神经网络的问题就是通过极小化损失函数来找到网络中的所有权值参数（包括偏置参数）。这个过程本质上就是利用这个神经网络函数来拟合这些数据，这个过程也称为“训练”或“学习”。&lt;/p&gt;
&lt;p&gt;误差反向传播算法（Error Back Propagation，BP）是神经网络训练时采用的一种通用方法。本质是随机梯度下降法。最早见于如下论文：&lt;/p&gt;
&lt;p&gt;[8-1] David E. Rumelhart, Geoffrey E. Hinton, and Ronald J. Williams. Learning internal representations by back-propagating errors. Nature, 323(99): 533-536, 1986.&lt;/p&gt;
&lt;p&gt;由于整个网络是一个复合函数，因此，训练的过程就是不断地应用“复合函数求导”（链式法则）及“梯度下降法”。反向传播算法从神经网络的输出层开始，利用递推公式根据后一层的误差计算本层的误差，通过误差计算本层参数的梯度值，然后将差项传播到前一层。然后根据这些误差来更新这些系数参数。&lt;/p&gt;
&lt;p&gt;值得一提的是，梯度下降法并不是唯一的优化方法。也有不少人使用其他优化方法，比如ADMM方法，来作为优化器优化深度神经网络的求解。&lt;/p&gt;
&lt;p&gt;8.3.            什么是好的激活函数？&lt;/p&gt;
&lt;p&gt;由万能逼近定理可知，只要网络规模设计得当，使用非线性函数作为激活函数（比如8.1节中常用的激活函数）的逼近能力都能够得到保证。&lt;/p&gt;
&lt;p&gt;然后，由上一节的反向传播算法可知，算法过程中计算误差项时每一层都要乘以本层激活函数的导数，因此，会发生很多次的导数连乘。如果激活函数的导数的绝对值小于1，多次连乘之后误差项很快会衰减到接近于0；而参数的梯度值由误差项计算得到，从而导致前面层的权重梯度接近于0，参数不能得到有效更新，这称为“梯度消失”问题。与之相反，如果激活函数导数的绝对值大于1，多次连乘后权重值会趋向于非常大的数，这称为“梯度爆炸”。长期以来，这两个问题一直困扰神经网络层次无法变得很深。&lt;/p&gt;
&lt;p&gt;最近几年，ReLU函数被经常使用作为深度神经网络的激活函数。有两个主要理由：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt; 该函数的导数为sgn（忽略在0处不可导的情形），计算简单，在正半轴导数为1，有效的缓解了梯度消失问题；
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt; 虽然它是一个分段线性函数，但它具有非线性逼近能力；使用ReLU激活函数的深度网络的本质是用分段（分片）线性函数（超平面）去逼近目标。
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;后来，人们在ReLU的基础上又改进得到各种其他形式的激活函数，包括ELU、PReLU等。&lt;/p&gt;
&lt;p&gt;8.4.            多个隐层的几何意义&lt;/p&gt;
&lt;p&gt;现在我们已经理解了深度神经网络的本质，就是一个复杂的多层复合函数。训练的过程就是在求激活函数变换得到的“基函数”，因此，训练神经网络的本质就是在“学习基函数”。这跟稀疏学习中的“字典学习”非常类似。殊途同归！&lt;/p&gt;
&lt;p&gt;我们来看一下深度神经网络所表达的拟合函数与传统所用的拟合函数（2.1节）的类比与区别：&lt;/p&gt;
&lt;p&gt;(1)   传统的拟合函数是在某一函数类（由某些具有良好性质的基函数所张成的函数空间）中进行选择。基函数是预先给定的，个数也是预先设定的（或者稀疏选择的）。系统的求解变量是基函数组合系数；&lt;/p&gt;
&lt;p&gt;(2)   神经网络所表达的拟合函数是由某一激活函数对变量的平移和伸缩变换而来，个数是预先设定的（神经元个数）。系统的求解变量是基函数的变换，因此可以看成是在学习基函数；&lt;/p&gt;
&lt;p&gt;(3)   传统的拟合函数也是一种神经网络（见第6节），因此也可以拓展成深度网络（复合函数），但问题是次数或阶数经过复合后会变得非常高，更易造成过拟合；&lt;/p&gt;
&lt;p&gt;(4)   多层神经网络中的不同层所用的激活函数也可以使用传统的基函数。因此，还可推广为更一般的深度神经网络。&lt;/p&gt;
&lt;p&gt;那么为何要用多个隐层呢？事实上，通过6.3节的内容就不难理解了。每个隐层就是将前一层的数据作为输入（当然也包括输入层数据）在当前这个维数的空间中的一种映射，本质上就是在做“参数化”！&lt;/p&gt;
&lt;p&gt;如果当前层的维数小于上一层的维数，就相当于将上一层的数据参数化到低维空间中。当然也可以参数化到高维空间，以提高自由度。&lt;/p&gt;
&lt;p&gt;在6.3节中，对于三维曲面，我们已知它是二维流形，因此，我们知道将其映射到二维作为参数域就很自然了。因此有了图11这样的网络结构。&lt;/p&gt;
&lt;p&gt;但对于一般的数据（比如人脸数据），是在背景空间（ambient space）上观测的，可能数据的维数非常高（比如1000x1000的图像按照像素个数的维数达到100万维）。但这些数据并不会充满整个高维空间，会具有低维的结构（称为本征维数），即数据落在一个低维子空间（或低维流形）上，并呈现一定的概率分布。从数据的角度来看，一个嵌入到高维空间的低维流形本质上就是一个参数曲面，参数域是那个低维空间。因此，将高维数据参数化到低维的空间是可行的。&lt;/p&gt;
&lt;p&gt;这里也出现了两个纠结的问题。&lt;/p&gt;
&lt;p&gt;第一，对于一个实际数据拟合问题，应该设置多少个隐层？&lt;/p&gt;
&lt;p&gt;第二，每个隐层应该设置多少个节点（该隐层的维数）？&lt;/p&gt;
&lt;p&gt;在机器学习领域，隐层的层数称为网络的深度，隐层的维数成为网络的宽度。对于基于深度神经网络的学习，到底是越深越好，还是越宽越好？&lt;/p&gt;
&lt;p&gt;从数学上来看，网络越深，表示一个复杂的函数可以经过多次参数化的变换，映射到最终的目标。这个是合理的。举个例子，比如我们想将一个三维网格曲面参数化到一个平面，如果这个输入的曲面比较复杂，开口（参数化边界）很小，则要将曲面一次性展开（&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image084.png&quot; alt=&quot;Image 270&quot; /&gt;到&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image077.png&quot; alt=&quot;Image 271&quot; /&gt;的映射）比较困难。此时，可以多进行几次从&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image084.png&quot; alt=&quot;Image 272&quot; /&gt;到&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image084.png&quot; alt=&quot;Image 273&quot; /&gt;的映射，将曲面先在&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image084.png&quot; alt=&quot;Image 274&quot; /&gt;慢慢张开，每次张开的映射比较容易表达和计算。最后再映射到&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image077.png&quot; alt=&quot;Image 275&quot; /&gt;上就相对容易了，当然还可进行多次从&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image077.png&quot; alt=&quot;Image 276&quot; /&gt;到&lt;img src=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/DL/What_is_DeepLearning.files/image077.png&quot; alt=&quot;Image 277&quot; /&gt;的映射，生成更好的参数化。注意其中任何一个映射都可以是用一个神经网络来表达。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image158.jpg&quot; alt=&quot;Image 278&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图17. 带有特征的曲面的拟合。(a) 原始输入三维数据；(b) 为(a)的简单参数化（Floater参数化）；(c) 为优化过后的参数化；(d) 最后的拟合曲面。&lt;/p&gt;
&lt;p&gt;在计算机图形学中，我们针对曲面展开及拟合问题，在如下的工作中用到了这种思想。&lt;/p&gt;
&lt;p&gt;[8-2] Linlin Xu, Ruimin Wang, Zhouwang Yang, Jiansong Deng, Falai Chen, Ligang Liu. Surface Approximation via Sparse Representation and Parameterization Optimization. Computer-Aided Design (Proc. SPM), 78: 179-187, 2016.&lt;/p&gt;
&lt;p&gt;如图17所示，(a) 为一个带有尖锐特征的输入点云，如果将其简单参数化为(b)，在其上构建的拟合曲面很难表现曲面的尖锐特征。这时我们对(b)中的参数化再做一个映射（优化）为(c)，这时在其上做的拟合曲面则能很好地表现出尖锐特征。注意，这里生成拟合曲面的基函数中我们采用了非光滑基函数（采用非光滑基函数来表现曲面特征的思想首次在我们的如下论文中所采用）。因此，上述工作本质上是一个使用5层神经网络（3个隐层）来优化拟合曲面。&lt;/p&gt;
&lt;p&gt;[8-3] Ruimin Wang, Ligang Liu, Zhouwang Yang, Kang Wang, Wen Shan, Jiansong Deng, Falai Chen.  Construction of Manifolds via Compatible Sparse Representations. ACM Transactions on Graphics, 35(2), Article 14: 1-10, 2016.&lt;/p&gt;
&lt;p&gt;这里顺便提一下，在计算机图形学中，最近一些年有不少工作在做曲面参数化的优化工作（比如满足无翻转、低扭曲等约束）。从机器学习的观点来看，就是在做更多的参数映射的优化计算。当然，这些工作并不能简单地看成一个深度神经网络来做。这是因为，对参数化的问题，我们是知道曲面（所有数据）的整体结构的，而不只是一些离散的采样点。因此，我们在做参数化优化的时候，我们可以充分利用曲面的整体结构来得到一些几何度量来满足各种约束，而这些是神经网络优化所做不到的！&lt;/p&gt;
&lt;p&gt;总之，对于第一个问题，隐层越多，表示网络越深，确实会使得最后的映射带来更好的表现。其数学本质是将输入数据不断在不同的空间中进行参数化映射。最后得到的映射（可能非常复杂的映射）表达为若干个相对简单映射的复合。对于多隐层的解释和讨论，机器学习领域及网上有很多文章进行过解释，大部分都解释为“提取数据的特征”等等。我们从逼近论的角度（结合三维曲面拟合的例子），将多隐层优化看成数据在不同维数空间的参数化，是非常容易直观理解的。&lt;/p&gt;
&lt;p&gt;对第二个问题，每个隐层的具体的节点数或维数，该如何设置呢？对于一般的数据这个就很难直观确定了，一般要根据经验。当然，也有一些办法来进行指导，我们将在下一节中理解。&lt;/p&gt;
&lt;p&gt;8.5.            流形学习（数据降维）简介&lt;/p&gt;
&lt;p&gt;对于一般的数据，我们并不知道其本征维数（即参数域空间），那么映射（参数化）到多少维空间是合适的呢？&lt;/p&gt;
&lt;p&gt;事实上，这个也是个非常纠结的问题！这个问题就是寻求高维数据的本征维数，在机器学习领域称为流形学习（Manifold learning），或降维问题（Dimension reduction）。如图18所示，数据是在三维空间给出的（B），每个点是3个坐标，看起来是三维数据；但其本质上位于三维空间的一张曲面上，即二维流形曲面上（A），其本征维数是2。因此，可以将其一一映射到平面上（C）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image159.jpg&quot; alt=&quot;Image 279&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图18. 流行学习。（图片来自论文[8-5]）&lt;/p&gt;
&lt;p&gt;提到流形学习，不能不提到如下的两篇开山之作（同时发在Science 2000的文章）：&lt;/p&gt;
&lt;p&gt;[8-4] Roweis, Sam T and Saul, Lawrence K. Nonlinear dimensionality reduction by locally linear embedding. Science, 290(5500). 2000: 2323-2326.&lt;/p&gt;
&lt;p&gt;[8-5] Tenenbaum, Joshua B and De Silva, Vin and Langford, John C. A global geometric framework for nonlinear dimensionality reduction. Science, 290(5500). 2000: 2319-2323.&lt;/p&gt;
&lt;p&gt;流形学习在本世纪初的前一个十年是一个研究热点（由上面两篇Science论文带起来的）。至今已发展出了许多方法，从简单的线性方法，比如PCA；到后面的非线性方法，比如局部线性嵌入（LLE），等距映射法（Isomap），Laplace特征映射，局部保投影法（LPP）等。这里不详细介绍。&lt;/p&gt;
&lt;p&gt;需要指出的是，正如第6节所讲的三维曲面参数化的计算，我们计算数据的本征维数的时候，是需要利用所有数据的信息及其几何或拓扑结构一起来分析的，而不能像神经网络训练那样，仅仅将数据灌到神经网络中去更新权系数。&lt;/p&gt;
&lt;p&gt;8.6.            端对端学习（End-to-end learning）&lt;/p&gt;
&lt;p&gt;在传统的机器学习中，很多任务的输入数据的维数都非常大，不易直接处理。往往需要先降到合适的维数，然后再选择合适的预测模型来做拟合。&lt;/p&gt;
&lt;p&gt;传统机器学习的流程一般由两个主要的模块组成。第一个模块称为特征工程，将原始输入数据（高维向量）变换为一个低维向量，即，用这个低维向量来作为表达输入数据的特征（或描述子，feature or descriptor）。不同的人有不同的方法来计算这个低维特征，称为特征抽取（Feature extraction），如图19显示了不同的图像特征抽取方法。各种计算的特征都有一定的实用范围，因此，有人就提出如何选择或组合各种特征得到更好的特征，这是特征工程的另一个子问题，称为特征选择（Feature selection）。针对三维形状分割，我们发现对三维局部块的众多描述子并不是串联起来一起使用更好，而是针对不同的形状的部位使用不同的描述子会更好，于是我们使用稀疏选择的方法来选择形状描述子用于形状分割，详细可见如下论文。&lt;/p&gt;
&lt;p&gt;[8-6] Ruizhen Hu, Lubin Fan, Ligang Liu.  Co-Segmentation of 3D Shapes via Subspace Clustering. Computer Graphics Forum (Proc. Symposium on Geometry Processing), 31(5): 1703-1713, 2012.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image160.jpg&quot; alt=&quot;Image 280: 1365435491_6508.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图19. 图像的各种特征抽取方法。&lt;/p&gt;
&lt;p&gt;由于这种特征是通过人为设计的算法来得到的，因此这种特征称为人工特征（Hand-crafted features）。人工特征的抽取需要人们对输入数据的认知或者领域知识（Domain knowledge），因此在很多情况下会局限于人的经验和认知。&lt;/p&gt;
&lt;p&gt;第二个模块称为预测模型，即选用什么样的预测方法来拟合给定的数据，我们前面所讲的拟合就是指这个过程。预测模型的目标就是希望学习到的模型在预测未知目标时越精确越好。一般要考虑模型的复杂度及精确度等因素。在机器学习领域有非常多的方法，这里不一一介绍。&lt;/p&gt;
&lt;p&gt;上述两个模块中的每个模块都是一个独立的任务，其结果的好坏会影响到下一步骤，从而影响整个训练的结果，这是非端到端的，如图20（上）所示。&lt;/p&gt;
&lt;p&gt;特征提取的好坏异常关键，甚至比预测模型还重要。举个例子，对一系列人的数据分类，分类结果是性别（男或女），如果你提取的特征是头发的颜色，无论分类算法如何，分类效果都不会好；如果你提取的特征是头发的长短，这个特征就会好很多，但是还是会有错误；如果你提取了一个超强特征，比如染色体的数据，那你的分类基本就不会错了。&lt;/p&gt;
&lt;p&gt;这就意味着，特征需要足够的经验去设计，这在数据量越来越大的情况下也越来越困难。于是就出现了端到端的网络，特征可以自己去学习。所以特征提取这一步也就融入到算法当中，不需要人来干预了。即不需要将任务分为多个步骤分步去解决，而是从输入端的数据直接得到输出端的结果。前面介绍的深度神经网络就是一个端到端的学习方法。如图20（下）所示。&lt;/p&gt;
&lt;p&gt;端到端学习的好处在于，使学习模型从原始输入到最终输出，直接让数据“说话”，不需人工设计的模块；给模型更多可以根据数据自动调节的空间，增加模型的整体契合度。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image161.jpg&quot; alt=&quot;Image 281&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图20. 非端到端的学习（上）与端到端的学习（下）。&lt;/p&gt;
&lt;p&gt;但端到端学习也有不足。第一，端到端的深度神经网络需要大量的样本数据才能工作得很好，因此很多公司都在花费大量的人力物力去生成标注数据（一般通过人工标注，催生了很多专门做数据标注的外包公司）；第二，人工设计的特征并不是都不能用的，有些人工特征还是能代表着人类智能的，是可以用来作为合理的特征的，而端到端的学习无法用这些特征。当然，通过适当的改造和结合，也可以集成人工特征到深度神经网络中，这里就不展开讨论。&lt;/p&gt;
&lt;p&gt;8.7.            深度学习成功的原因&lt;/p&gt;
&lt;p&gt;基于深度神经网络的端到端学习在最近几年取得很大的成功，被大量应用与计算机视觉、语音识别、自然语音处理、医学图像处理等领域中。从数学本质上来看，神经网络就是一个映射函数而已，在上世纪50年代就有了感知机，但为什么以前没有火呢？ 主要有以下的两方面的原因。&lt;/p&gt;
&lt;p&gt;第一，之前没有那么大规模的数据量；&lt;/p&gt;
&lt;p&gt;第二，以前的工程技术（先进优化算法及支持大规模并行计算的GPU硬件）无法求解的很深的神经网络。&lt;/p&gt;
&lt;p&gt;因此，在上个世纪90年代，各种浅层模型大行其道，比如只有一层隐层的支撑向量机（Support Vector Machine，SVM）以及没有隐层的逻辑回归方法（Logistic Regression，LR）等。&lt;/p&gt;
&lt;p&gt;直到最近几年，随着各种传感器的大量使用以及移动互联网的广泛应用，能够获取和产生海量（PB级甚至ZB级）的数据（比如文本、图像、语音等）。特别是ImageNet图像数据库的诞生以及基于该数据库的各种竞赛，直接将计算机视觉领域中的深度学习的研究与应用推向了“落地”，催生了大量的计算机视觉的人工智能公司。&lt;/p&gt;
&lt;p&gt;8.8.            过拟合&lt;/p&gt;
&lt;p&gt;自从深度学习火了后，各种深度神经网络（或CNN网络）随之产生了，比如2012年的AlexNet有8层；2014年的VGG-19有19层；2014年的GoogleNet有22层；2015年的ResNet有152层！甚至还出现了上千层的深度神经网络！&lt;/p&gt;
&lt;p&gt;从数学上可知，拟合函数所带的参数的个数与样本数据的个数之间的差代表着这个拟合函数的“自由度”。网络越来越“深”后，拟合模型中的可调整参数的数量就非常大，通常能达到百万计甚至几十亿级。因此，层数很大的深度网络（模型过于复杂）能够表达一个自由度非常大的函数空间，甚至远高于目标函数空间（过完备空间），即自由度远大于0。这样就很容易导致过拟合（Overfitting），如前面所讨论过的图2（右）所示。&lt;/p&gt;
&lt;p&gt;过拟合可以使得拟合模型能够插值所有样本数据（拟合误差为0！）。但拟合误差为0不代表模型就是好的，因为模型只在训练集上表现好；由于模型拟合了训练样本数据中的噪声，使得它在测试集上表现可能不好，泛化性能差。为此，人们采取了不同的方法来缓解过拟合（无法完全避免），比如正则化、数据增广、Dropout、网络剪枝等。&lt;/p&gt;
&lt;p&gt;在使用深度神经网络来做深度学习的应用中，很多工作都是直接使用现有的深度神经网络，或者改造现有的深度神经网络。如果网络设计不够好，大部分结果都可能有过拟合的现象。&lt;/p&gt;
&lt;p&gt;在实际应用中，我们可以挑选样本数据中的一部分作为训练数据集，其他的作为测试数据集。如果网络在训练数据集上表现好（即损失函数很小），而在测试数据集上表现不够好，那么就可能发生了过拟合，此时就适当减少网络的层数或者节点数。这个过程是需要有耐心，可能需要花费很长时间才能调到一个合适的网络。需要靠感觉、经验和运气。因此，有人戏称调试深度神经网络的过程为“炼丹”。&lt;/p&gt;
&lt;p&gt;8.9.            类比神经科学的解释&lt;/p&gt;
&lt;p&gt;我们已从函数逼近论的角度来理解了人工神经网络本质是传统逼近函数的一个推广，由人工选取基函数到自动学习基函数，由人工提取特征到自动计算特征（参数化），能够较容易理解人工神经网络学习是如何工作的。&lt;/p&gt;
&lt;p&gt;在机器学习领域，人们从生物神经网络的角度来解释和理解人工神经网络的工作原理，将人工神经网络看成为一个可以模拟人脑工作行为的函数。&lt;/p&gt;
&lt;p&gt;在生物神经科学（Neuroscience，包括脑科学、认知神经科学等）的研究中，人们发现，人体的神经元通过树突接受信号。这些信息或信号随后被传递到脑细胞或细胞体。在细胞体内部，所有的信息将被加工生成一个输出。当该输出结果达到某一阈值时，神经元就会兴奋，并通过轴突传递信息，然后通过突触传递到其他相连的神经元。神经元间传输的信号量取决于连接的强度。如图21（左）。&lt;/p&gt;
&lt;p&gt;我们来类比人工神经网络：如果把树突想象成人工智能网络中基于突触感知器的被赋予了权重的输入。然后，该输入在人工智能网络的“细胞体”（神经元）中相加。如果得出的输出值大于阈值单元，那么神经元就会“兴奋”（激活），并将输出传递到其它神经元，如图21（右）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image162.jpg&quot; alt=&quot;Image 282&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图21. 左：人脑神经元结构；右：从生物神经网络类比得出的人工神经元结构。&lt;/p&gt;
&lt;p&gt;（图片来自互联网）&lt;/p&gt;
&lt;p&gt;在计算机视觉领域，人们也从视觉神经科学（Visual Neuroscience）中类比来解释了在计算机视觉领域用得最多的卷积神经网络（CNN）的工作机理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image163.jpg&quot; alt=&quot;Image 283&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图22. 视觉皮层结构。（图片来自互联网）&lt;/p&gt;
&lt;p&gt;由视觉机理的研究发现，动物大脑的视觉皮层具有分层结构。眼睛将看到的景象成像在视网膜上，视网膜把光学信号转换成电信号，传递到大脑的视觉皮层（Visual cortex），视觉皮层是大脑中负责处理视觉信号的部分。1959年，有科学家进行了一次实验，他们在猫的大脑初级视觉皮层内插入电极，在猫的眼前展示各种形状、空间位置、角度的光带，然后测量猫大脑神经元放出的电信号。实验发现，当光带处于某一位置和角度时，电信号最为强烈；不同的神经元对各种空间位置和方向偏好不同。这一成果后来让他们获得了诺贝尔奖。&lt;/p&gt;
&lt;p&gt;目前已经证明，视觉皮层具有层次结构。从视网膜传来的信号首先到达初级视觉皮层（primary visual cortex），即V1皮层。V1皮层简单神经元对一些细节、特定方向的图像信号敏感。V1皮层处理之后，将信号传导到V2皮层。V2皮层将边缘和轮廓信息表示成简单形状，然后由V4皮层中的神经元进行处理，它颜色信息敏感。复杂物体最终在IT皮层（inferior temporal cortex）被表示出来。&lt;/p&gt;
&lt;p&gt;卷积神经网络可以看成是上面这种机制的简单模仿。它由多个卷积层构成，每个卷积层包含多个卷积核，用这些卷积核从左向右、从上往下依次扫描整个图像，得到称为特征图（feature map）的输出数据。网络前面的卷积层捕捉图像局部、细节信息，有小的感受野，即输出图像的每个像素只利用输入图像很小的一个范围。后面的卷积层感受野逐层加大，用于捕获图像更复杂，更抽象的信息。经过多个卷积层的运算，最后得到图像在各个不同尺度的抽象表示（由底层到高层的特征表达），如图23所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image164.jpg&quot; alt=&quot;Image 284&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图23. 基于卷积神经网络的深度学习所得到的人脸图像的分层特征。&lt;/p&gt;
&lt;p&gt;（图片来自于Stanford大学的论文）&lt;/p&gt;
&lt;p&gt;笔者认为，利用神经科学的神经元或神经网络来解释深度学习中的人工神经网络，这仅仅是类比而已。从我们的分析可知，深度学习中的人工神经网络并没有真正的认知和学习！如果我们人类对自己的认知系统无法完全了解的话，我们是很难发展出真正的人工智能技术。&lt;/p&gt;
&lt;p&gt;8.10.        深度人工神经网络的局限：保持结构的映射&lt;/p&gt;
&lt;p&gt;我们从数学上理解了深度人工神经网络本质上是表达不同维数空间之间的一个映射（函数）。给了一些样本点后，通过调整网络的参数权系数，不断极小化损失函数，从而达到最好的拟合结果得到了拟合函数。&lt;/p&gt;
&lt;p&gt;这个拟合过程只极小化了逐点的误差或者累积逐点误差，而无法考虑点与周围点之间的其他信息（比如邻域几何结构、局部几何度量、流形的整体拓扑结构等）。如果要考虑点之间的几何与拓扑的结构信息，则深度人工神经网络就无能为力（当然一定要改造也是可以的），这时就需要其他的数学方法了。有点像数学分析中，逐点收敛和一致收敛，逐点连续和一致连续的区别。&lt;/p&gt;
&lt;p&gt;例如，前面介绍的流形学习中，LLE方法保持每个样本点与它相邻的多个点的线性组合（体现了局部线性）来重构低维空间的点的分布，相当于用分段的线性面片近似代替复杂的几何形状，样本投影到低维空间保持这种线性重构关系，如图24（左）所示。Isomap方法希望保持数据在低维空间的映射之后能够保持流形上的测地线距离，即全局的几何结构，如图24（右）所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image165.jpg&quot; alt=&quot;Image 285&quot; /&gt;    &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image166.jpg&quot; alt=&quot;Image 286&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图24. 流形学习。左：保持局部的几何信息（LLE）；右：保持全局的距离信息（Isomap）。&lt;/p&gt;
&lt;p&gt;（图片分别来自于论文[8-4]和[8-5]）&lt;/p&gt;
&lt;p&gt;再如，在计算机图形学和几何处理领域，我们做的很多映射（比如三维网格曲面的参数化），也需要保持曲面上的某些几何性质（保角度、保面积、保形等），也发展出许多不同的求解映射的方法和技巧。例如，以下两个工作是我们做的有关三维曲面参数化到二维平面的工作，第一个工作是曲面参数化工作的经典方法之一，已经被集成到3D System公司的建模软件以及著名的计算几何算法&lt;a href=&quot;https://www.cgal.org/&quot;&gt;CGAL库&lt;/a&gt;（The Computational Geometry Algorithms Library）中。第二个工作是今年我们最新的一个工作，能快速生成无翻转和低扭曲的网格参数化，论文即将在下周的Siggraph 2018会议上汇报。&lt;/p&gt;
&lt;p&gt;[8-7] Ligang Liu, Lei Zhang, Yin Xu, Craig Gotsman, Steven J. Gortler.  A Local/Global Approach to Mesh Parameterization. Computer Graphics Forum (Proc. Eurographics Symposium on Geometry Processing (SGP)), 27(5), 1495-1504, 2008.&lt;/p&gt;
&lt;p&gt;[8-8] Ligang Liu, Chunyang Ye, Ruiqi Ni, Xiao-Ming Fu. Progressive Parameterizations.  ACM Transactions on Graphics (Proc. Siggraph), 37(4), Article 41: 1-12, 2018.&lt;/p&gt;
&lt;p&gt;在计算机图形学中，有时我们也需要将三维空间的二维流形曲面映射到另一个规则二维流形曲面，比如球面上，这时称为球面参数化。如读者有兴趣可阅读我们如下的3篇有关球面参数化的工作。&lt;/p&gt;
&lt;p&gt;[8-9] Xin Hu, Xiao-Ming Fu, Ligang Liu. Advanced Hierarchical Spherical Parameterizations. IEEE Transactions on Visualization and Computer Graphics, to appear, 2018.&lt;/p&gt;
&lt;p&gt;[8-10] Chunxue Wang, Xin Hu, Xiaoming Fu, Ligang Liu. Bijective Spherical Parametrization with Low Distortion. Computers&amp;amp;Graphics (Proc. SMI), 58: 161-171, 2016.&lt;/p&gt;
&lt;p&gt;[8-11] Chunxue Wang, Zheng Liu, Ligang Liu. As-Rigid-As-Possible Spherical Parameterization. Graphical Models (Proc. GMP), 76(5): 457-467, 2014.&lt;/p&gt;
&lt;p&gt;另外，在计算机图形学及计算机辅助几何设计领域，我们还有独特的曲线和函数的构造方法，如通过Bernstein基函数构造的Bezier曲线曲面，通过B样条基构造的B样条曲线曲面（分段Bezier曲线曲面），以及更一般的非均有有理B样条曲线曲面，通过控制顶点就能很直观控制曲线曲面的形状，而且发展出非常完备的理论及设计方法，如图25所示。这些独特的曲线曲面的构造方法也是我们领域独特的，已成为现代工业中产品曲面造型的工业标准（标准数学表达）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image167.jpg&quot; alt=&quot;Image 287&quot; /&gt;  &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image168.jpg&quot; alt=&quot;Image 288&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图25. NURBS曲线曲面：产品曲面造型的工业标准。（图片来源与互联网）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;九、&lt;/strong&gt;   &lt;strong&gt;实战深度神经网络学习&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于本文是面向非机器学习专业介绍深度学习的，因此，笔者在这里只是大致介绍一下各种基于深度神经网络的学习方法的实际技巧，不详细展开讨论，有兴趣的读者可查阅更专业的书籍或论文。&lt;/p&gt;
&lt;p&gt;9.1.            看懂各种深度神经网络结构&lt;/p&gt;
&lt;p&gt;从数学上来看，深度神经网络仅仅是一种函数的表达形式，是复杂的多层复合函数。由于它有大量的可调参数，而且近年来随着大数据、优化算法和并行计算GPU硬件的发展，使得用大规模的神经网络来逼近和拟合大数据成为可能。至今，不同领域的研究工作者及产业界工作者已将深度神经网络应用到各行各业的各个问题，而且提出了各种形式、各种结构的深度网络结构，使人眼花缭乱，似乎难以捉摸。但事实并非如此！&lt;/p&gt;
&lt;p&gt;万变不离其宗，神经网络就是一个多层复合函数。网络结构发生改变，就是说函数的复合形式发生了变化。因此，只要掌握了这条原则，各种复杂的神经网络你就能轻松看懂。亦可参考互联网上的“&lt;a href=&quot;https://blog.csdn.net/qq_35082030/article/details/73368962&quot;&gt;一文看懂25个神经网络模型&lt;/a&gt;”一文。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image169.jpg&quot; alt=&quot;Image 289&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图26. 多层神经网络所表达的函数：可以看成前面的若干层网络所表达的函数（蓝色）与后面若干层网络所表达的函数（红色）的复合。&lt;/p&gt;
&lt;p&gt;简单地说，看懂各种神经网络结构只需看懂如下3个要素（具体解释就不详细展开了）：&lt;/p&gt;
&lt;p&gt;(1)   神经元与激活函数：神经元接收什么数据，通过什么样的激活函数输出数据。人们发明了许多不同种类的神经元，比如，池化神经元和插值神经元（Pooling and interpolating cells）、概率神经元（Mean and standard deviation cells）、循环神经元（Recurrent cells ）、长短期记忆神经元（Long short term memory cells）、门控循环神经元（Gated recurrent cells）等。不管什么样形式和名称的神经元，我们只要搞明白神经元是通过什么样的函数来将接收数据变为输出数据，不同之处就在接收数据和激活函数不同而已，如图21（右）所示。&lt;/p&gt;
&lt;p&gt;(2)   神经网络结构：不同的神经网络就是不同的多层复合形式的函数。比如，卷积神经网络（Convolutional Neural Network，CNN）就是一种限于局部感受野来改造的神经网络（线性组合特殊化为局部区域的卷积操作，且增加了池化(Pooling)层），特别适合于文本、图像及视频类数据的深度学习。再比如，残差神经网络（Residual Neural Network，ResNet）有一种特殊的连接，可以把数据从某一隐层传至后面几层（通常是2到5层）。该网络的目的不是要找输入数据与输出数据之间的映射，而是致力于构建输入数据与输出数据+输入数据之间的映射函数。本质上，ResNet 是在学习映射函数的一阶差分（一阶导数），能够有效抑制优化过程中的梯度消失。类似地， DenseNet (CVPR 2017) 实质上是在学习映射函数的高阶差分，因此也能有效抑制梯度消失现象。同样地，其他的各种神经网络结构也很容易看懂的，比如 AutoEncoder，GAN，Variational GAN等。&lt;/p&gt;
&lt;p&gt;(3)   神经网络的组合：一个多层的神经网络就是一个多次复合的函数。中间的任何一层的输出都可以看成为原始输入数据的一个特征。如图26所示，一个多层神经网络所表达的函数：可以看成前面的若干层网络所表达的函数（蓝色）与后面若干层网络所表达的函数（红色）的复合。因此，在任何的一个中间层，可以修改输出的特征向量、可以插入一个其他的神经网络（将该特征向量作为输入，或与其他网络的特征向量进行叠加、运算等）等等。如果将神经网络看成为积木，整个组合过程就像在“搭积木”。这样就可以发明和产生无穷无尽的网络结构（比如，并行网络、累加网络等等很多网络名称）。在实际应用中，需要根据问题本身的特点来合理设计网络的结构。具体哪种网络结构合理，有无最好，都是组要根据问题本身思考和试验的，主要是要看损失函数的误差以及在应用中的效果来决定的。这个我们在后面还会进一步讨论。&lt;/p&gt;
&lt;p&gt;9.2.            如何调试深度神经网络？&lt;/p&gt;
&lt;p&gt;一个深度神经网络所表达的函数具有成千上万个参数，为了让损失函数在训练数据上达到最小，就需要设计合理的网络来拟合这些数据。在优化的过程中，要保证迭代收敛也是必要的。&lt;/p&gt;
&lt;p&gt;一般地，调试较大的深度神经网络所花费的时间和劳力比调试传统程序要多，而且要有耐心！因为如果最后的结果不好（损失函数很大或者不收敛），如果确认你的代码无bug，那么原因只有一个，就是你所调的网络还不够好(orz)！&lt;/p&gt;
&lt;p&gt;在调试神经网络的过程中，有太多不确定的因素需要你去仔细思考并小心翼翼地去调试，而这些大部分都需要靠直觉、经验和少许运气来调试决定的，比如：&lt;/p&gt;
&lt;p&gt;(1)   需要选取多大的神经网络（也就是选用什么样的拟合函数）？具体地，网络要多少层？每层多少节点？这个只能凭直觉或经验了。简单点的话，就套用现成的网络结构，或者再经过一些修改即可。从函数的自由度来看，网络的参数个数与数据大小不应相差太大。&lt;/p&gt;
&lt;p&gt;(2)   初始化。对于高度非线性的函数的最优化，一个非常重要的因素就是如何挑选一个好的初始化？&lt;/p&gt;
&lt;p&gt;(3)   在优化过程中，如何判断优化过程是否收敛？&lt;/p&gt;
&lt;p&gt;(4)   是否发生了过拟合？&lt;/p&gt;
&lt;p&gt;(5)   … ….&lt;/p&gt;
&lt;p&gt;以下有些简单的小经验分享下：&lt;/p&gt;
&lt;p&gt;(1)   一定要可视化你的结果！这样有助于你在训练过程中发现问题。你应该明确的看到这些数据：损失函数的变化曲线、权重直方图、变量的梯度等。不能只看数值，一定要可视化！&lt;/p&gt;
&lt;p&gt;(2)   网络不是越深越好！不要一上来就用VGG19, ResNet50等标准的大网络，可能你的问题只要几层就能解决问题。&lt;/p&gt;
&lt;p&gt;(3)   先建立一个较小的网络来解决核心问题，然后一步一步扩展到全局问题。&lt;/p&gt;
&lt;p&gt;(4)   先用小样本做训练，有了感觉后，再调试大的训练数据。&lt;/p&gt;
&lt;p&gt;(5)   如果在几百次迭代后，迭代还没开始收敛，那么就要终止迭代，不要傻等了！要考虑修改你的网络了。&lt;/p&gt;
&lt;p&gt;(6)   注意避免梯度消失或梯度爆炸。&lt;/p&gt;
&lt;p&gt;(7)   另外，在互联网上还能找到许多网友们分（tu3）享（cao2）的实用调网络的经验，读者可自行去查找学习。&lt;/p&gt;
&lt;p&gt;值得提醒的是，上述分享的各个经验没有绝对的对与错，须将它们当作经验去学习和使用即可。需要根据你自己的实际问题来设计和调试你的深度神经网络。&lt;/p&gt;
&lt;p&gt;即便对于行家来说，调试较大的神经网络也是一项艰巨的任务。数百万个参数在一起决定的函数，一个微小的变化就能毁掉所有辛勤工作的成果。然而不进行调试以及可视化，一切就只能靠运气，最后可能浪费掉大把的青春岁月。&lt;/p&gt;
&lt;p&gt;正因为这些原因，调试深度神经网络被认为是个不可解释的“黑箱子”，优化网络的过程成为“调参”，也被戏称为“炼丹”，是个需要丰富经验的“技术活”。&lt;/p&gt;
&lt;p&gt;9.3.            深度学习开发工具&lt;/p&gt;
&lt;p&gt;要学习和使用基于深度神经网络的深度学习，门槛并不高。你大不必从头开始自己搭建神经网络系统和实现优化算法。近几年来，很多大公司和科研机构都在研究自己的深度学习框架，且推出了不少深度学习开发平台（如图27），深度学习的开发框架和工具也越来越多，使得应用深度学习的入门门槛越来越低。使用好的开发工具，可让使用者减少底层开发的工作量，而将重点关注于深度学习应用逻辑的开发及模型的优化上，提高开发效率。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image170.jpg&quot; alt=&quot;Image 290&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图27. 基于深度神经网络的深度学习的开发工具。（图片来自互联网）&lt;/p&gt;
&lt;p&gt;这里简单介绍几款大家常用的深度学习开发工具包，基本都是开源的。&lt;/p&gt;
&lt;p&gt;(1)   TensorFlow, 由Google公司发布。支持多CPU及多GPU并行化运行，并支持CNN，RNN等主要的深度学习模型。Github社区人气最火的深度学习开源项目。&lt;/p&gt;
&lt;p&gt;(2)   Caffe，由加拿大Berkeley BVLC实验室发布。使用最广泛的深度学习工具之一，提供C++，Python，Matlab等语言接口。&lt;/p&gt;
&lt;p&gt;(3)   Torch，基于 Lua 脚本语言的工具，支持 iOS、 Android 等嵌入式平台。&lt;/p&gt;
&lt;p&gt;(4)   Theano，基于Python语言开发的深度学习开源仿真平台。&lt;/p&gt;
&lt;p&gt;(5)   Keras，基于Python语言开发的，底层库使用Theano或TensorFlow。其模块化特性非常适合刚入门的初学者快速实验并测试深度学习网络的性能，同时也开放提供对底层的修改。&lt;/p&gt;
&lt;p&gt;关于这些开发工具包的使用，互联网上（包括Github）有非常丰富的教材和使用文档，读者有兴趣可以自行查阅学习。&lt;/p&gt;
&lt;p&gt;9.4.            深度神经网络专用芯片&lt;/p&gt;
&lt;p&gt;深度神经网络专用芯片（使用GPU+DNN的专用芯片）是一种特殊用途的处理器，它能够使得深度神经网络的训练更快，具有更高的性能和更低的功耗。DNN 专用芯片在性能和能源消耗方面的好处是显著的，DNN专用芯片的广泛使用还需要神经网络体系结构的标准化和对不同DNN框架的支持。国外的一些公司，包括Google、Nvidia、Intel等公司，已经开发和部署了DNN专用芯片，为基于DNN的应用程序提供了极高的性能。国内也有不少公司（如寒武纪、阿里巴巴等）在从事DNN专用芯片的研发，也已经达到国际前沿水平。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;十、&lt;/strong&gt;   &lt;strong&gt;深度神经网络的能力与局限&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;深度学习真有智能吗？遗憾的是，没有！&lt;/p&gt;
&lt;p&gt;10.1.        基于深度神经网络的深度学习的本质再回顾&lt;/p&gt;
&lt;p&gt;在本文，笔者从函数逼近论的角度已详细剖析了基于深度神经网络的深度学习，归纳为以下4个基本点：&lt;/p&gt;
&lt;p&gt;(1)   深度神经网络（DNN）是一个复合函数。对于任何单变量函数，只要神经元足够多，神经网络函数就能任意逼近它；对于任何多变量函数，一定可以被多个单变量函数的复合来逼近，因此就能被深度神经网络函数进行逼近；上述两点为神经网络函数的表达能力提供了理论基础；&lt;/p&gt;
&lt;p&gt;(2)   基于DNN的深度学习是个数据拟合（最小二乘回归）的过程；&lt;/p&gt;
&lt;p&gt;(3)   拟合过程是在学习基函数；&lt;/p&gt;
&lt;p&gt;(4)   多层映射是在做多次变换（或参数化）。&lt;/p&gt;
&lt;p&gt;因此，基于DNN的深度学习是可以很清楚被理解的！具体的应用过程中，选多少层、选多少基的问题在逼近论中就是没有很好的解决方案，这是逼近论中就存在的问题，并不是深度网络带来的问题！&lt;/p&gt;
&lt;p&gt;从数学本质来看，深度学习是在做最小二乘回归；其他的机器学习方法也是基于最小二乘回归的其他回归方法或者统计方法。&lt;/p&gt;
&lt;p&gt;从应用性来看，还有以下一些对基于深度神经网络的深度学习的本质的说明：&lt;/p&gt;
&lt;p&gt;(1)   基于DNN的深度学习实际上在做拟合和统计，网络结构设计需要靠直觉、技巧和经验以及运气；&lt;/p&gt;
&lt;p&gt;(2)   激活函数和损失函数的选择也很重要；&lt;/p&gt;
&lt;p&gt;(3)   DNN的层数、各层的神经元个数决定了该函数的参数；一般的DNN都具有非常多的参数；&lt;/p&gt;
&lt;p&gt;(4)   DNN适合拟合大规模数据；对小规模数据，不建议用DNN；&lt;/p&gt;
&lt;p&gt;(5)   任何一个中间隐层的输出向量都可以作为输入数据的特征（在该维数上的），也是输入数据的参数化；&lt;/p&gt;
&lt;p&gt;(6)   DNN可以任意拼装、组合成各种复杂的网络结构；&lt;/p&gt;
&lt;p&gt;(7)   大部分论文中的DNN结果都可能是过拟合；因此，很容易出现误判的情况（输入的轻微变化，比如给图片加少量噪声，结果就相差很大），容易犯大错；&lt;/p&gt;
&lt;p&gt;(8)   DNN是以成败论英雄的，需要在实际应用中好才是真的好，而这个永远不知道。&lt;/p&gt;
&lt;p&gt;需要再提一下的是，本文所讨论的基于DNN的深度学习只是深度学习的一种方法而已。还有其他的深度学习，比如南京大学周志华老师团队所提的深度森林等方法。&lt;/p&gt;
&lt;p&gt;10.2.        深度神经网络具有“智能”吗？&lt;/p&gt;
&lt;p&gt;从上面的剖析来看，基于DNN的深度学习实质上就是对样本数据集的拟合而已！显而易见，它仅仅是一个由数据驱动的产生的拟合器或分类器，根本不是一个“认知系统”！我们并没有看出来它有任何“智能”（即对数据所呈现的规律、知识的理解）的存在！对人工神经网络的研究可能仍然是几十年前的进展，只不过现在网络的规模变大了（数据大了，优化强了）而已！&lt;/p&gt;
&lt;p&gt;从逼近论的角度来看，如果数据足够大，多到足以（稠密）覆盖整个目标函数，那么简单的最近邻查找或者局部线性插值的性能就足够好了。此时，笔者猜测，深度学习的性能与最近邻查找的性能可能相差无几！&lt;/p&gt;
&lt;p&gt;举个例子，市面上出现了许多种类的所谓的“智能机器人”，声称可以与人进行自由对话。建议读者去测试一下这些对话机器人，你们就会发现，这些机器人的问答系统基本没有理解（只有少数有少量简单的理解）。如果对于在其数据库中存在的问题或类似的问题，机器人能够回答得比较合理；如果遇上需要逻辑推理的问题，这些机器人基本就答非所问，或者王顾左右而言他，甚至开始“卖萌”了。有空去逗逗这些对话机器人也是蛮有意思的事。&lt;/p&gt;
&lt;p&gt;对于自动翻译等机器人，只要有足够的两种语言的对应词条或句子（比如有些公司的词库数据库非常庞大，达到亿级），就能“翻译”（拟合）得还不错，达到一定的实用水准。但从本质上来讲，这些翻译算法并没有真正理解语言本身！&lt;/p&gt;
&lt;p&gt;关于深度学习，我们要有清醒的认识：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt; 深度学习模型需要大量的训练数据，才能有较好的效果；因为这些学习模型都在做数据拟合或回归，或者是在做统计；
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt; 实际问题中，往往会遇到小样本问题，采用传统的简单的机器学习方法，则可以很好地解决了，没必要非得用复杂的深度学习方法；
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt; 神经网络看起来来源于人脑神经元的启发，但绝不是人脑的模拟！它只是一个复合函数！举个例子，给一个三四岁的小孩看过几只猫之后，他就能识别其他的猫。也就是说，人类的学习过程往往不需要大规模的训练数据，而现在的深度神经网络的学习方法显然不是对人脑的模拟。
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这几年各种媒体的大量夸张的报道和宣传（即使是战胜人类的围棋算法AlphaGo，也并不是真正的人工智能，而仅仅是机器在一定的游戏规则下的策略计算能力），极度夸大了人工智能的进展，让很多大众误认为“强人工智能”已经来临，甚至产生不必要的恐慌。&lt;/p&gt;
&lt;p&gt;事实上，现在的人工智能的进展仍然很小，正如清华大学人工智能研究院院长张钹院士在2018年全球人工智能与机器人峰会（CCF-GAIR）上的报告上所指出的：“人工智能刚刚起步，离真正的人工智能还很遥远… 我们必须走向具有理解的人工智能，这才是真正的人工智能。”&lt;/p&gt;
&lt;p&gt;10.3.        深度学习在工业界的应用&lt;/p&gt;
&lt;p&gt;虽然近几年发展起来的基于DNN的深度学习并未产生真正的智能。但由于现在有大量的数据，基于数据驱动的深度学习方法可以在很多领域确实得到了落地的应用。特别是在计算机视觉领域，比如人脸识别、图像分割与识别等，该领域做了很多年的一些问题的研究工作，瞬间就被深度学习所击败！深度学习取得了巨大的成功！因此，我们仍能使用深度学习解决不少问题。&lt;/p&gt;
&lt;p&gt;近几年，催生了大量的人工智能公司，分布在安防、医疗、金融、智能机器人、自动驾驶、智能芯片、智能家居等领域；各高校也纷纷构建了人工智能研究院或大数据学院等；各学会成立了人工智能相关的专业委员会；国家也纷纷出台了有关人工智能的政策与文件，包括《新一代人工智能发展规划》，鼓励人工智能方面的人才培养（从娃娃抓起）和产业落地。在科研领域，大量的研究工作者和学生都涌进到人工智能领域，在一些人工智能或计算机视觉领域的会议的投稿量迅速增加，参加会议的人数达到历史新高。&lt;/p&gt;
&lt;p&gt;但残酷的事实是，绝大部分的人工智能公司都是“伪人工智能”，他们或者仅仅在做着数据标注的工作，因为标注数据的多少决定着拟合函数的“智能”！另外，已经有些公司因未能找到合适的盈利模式而倒闭。前几年对深度学习及智能的期望并未达到人们及投资者的预期目标。今年年初，李开复曾指出：“2018年是AI泡沫破裂之年”。&lt;/p&gt;
&lt;p&gt;从两年前人工智能热潮的爆发，到现在热潮逐渐退去，人们也越来越趋于冷静来认识人工智能，对其研究与应用逐渐趋于务实。笔者也希望人工智能能真正快速发展，让人类的生活变得越来越美好！&lt;/p&gt;
&lt;p&gt;10.4.        深度学习与人工智能的关系&lt;/p&gt;
&lt;p&gt;1956年，几个计算机科学家相聚在达特茅斯会议，提出了“人工智能”（Artificial Intelligence， AI）的概念，梦想着用计算机来构造复杂的、拥有与人类智慧同样本质特性的机器。人工智能研究领域范围很广，包括专家系统、机器学习、进化计算、模糊逻辑、计算机视觉、自然语言处理、推荐系统等，如图27 （左）。&lt;/p&gt;
&lt;p&gt;机器学习（Machine Learning, ML）是一种实现人工智能的方法。其基本做法是使用算法来解析数据、从中学习，然后对真实世界中的事件做出决策和预测。与传统的为解决特定任务、硬编码的软件程序不同，机器学习是用大量的数据来“训练”，通过各种算法从数据中学习如何完成任务。传统的机器学习算法包括决策树、聚类、贝叶斯分类、支持向量机、EM、Adaboost等等。从学习方法上来分，机器学习算法可以分为监督学习（如分类问题）、无监督学习（如聚类问题）、半监督学习、集成学习、深度学习和强化学习等。&lt;/p&gt;
&lt;p&gt;深度学习（Deep Learning, DL）是一种实现机器学习的技术，是解决特征表达的一种学习过程。现在常指利用深度神经网络的深度学习。在很早就有人提过，但由于当时训练数据量不足、计算能力落后，因此深度学习的效果不尽如人意；直到近几年，深度学习才较好地实现了各种任务。事实上，除了基于深度神经网络的深度学习，还有其他形式（比如深度森林）的深度学习方法。&lt;/p&gt;
&lt;p&gt;因此，机器学习是一种实现人工智能的方法，深度学习是一种实现机器学习的技术，而深度神经网络是实现深度学习的一种具体的实现工具，如图28（右）所示。简而言之，从范畴来讲，他们的关系如下：&lt;/p&gt;
&lt;p&gt;深度神经网络 &amp;lt; 深度学习 &amp;lt; 机器学习 &amp;lt; 人工智能&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image171.jpg&quot; alt=&quot;Image 291&quot; /&gt;  &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image172.jpg&quot; alt=&quot;Image 292&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图28. 左：人工智能的研究范畴；右：人工智能、机器学习和深度学习的关系。&lt;/p&gt;
&lt;p&gt;（图片来自互联网）&lt;/p&gt;
&lt;p&gt;但残酷的事实是，近几年流行的基于深度神经网络的深度学习仅仅是一个数据拟合器，并不存在着分析与理解等智能的能力。现有的技术和方法离真正的人工智能还非常遥远！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;十一、&lt;/strong&gt;        &lt;strong&gt;三维几何数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在计算机图形学中，我们研究的对象是三维（3D）形状对象，即虚拟空间中的数字化的物理实体。表达3D对象的3D几何数据是继声音、图像、视频之后的第四代数字可视媒体（如图29），已逐渐具有越来越广泛的应用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image173.jpg&quot; alt=&quot;Image 293&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图29. 四代可视媒体的发展：声音、图像、视频、3D几何。&lt;/p&gt;
&lt;p&gt;11.1.        3D 数据的重要性&lt;/p&gt;
&lt;p&gt;地球上的人及所有动物都有两只眼睛，每只眼睛类似于一台照相机，看到的是场景在视网膜（成像平面）上的投影图像，如图30（左）。两只眼睛位置不同，就产生对同一场景的视差，从而在大脑生成了场景的立体和3D信息（双目立体视觉原理），如图30（右）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image174.jpg&quot; alt=&quot;Image 294&quot; /&gt;  &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image175.png&quot; alt=&quot;Image 295&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图30. 左：单眼看到的是图像，为三维世界在成像平面上的投影影像；右：人类及动物的两只眼睛通过双眼的视差产生了对场景物体的立体和三维的信息。（图片来自于互联网）&lt;/p&gt;
&lt;p&gt;因此，人类及动物的视觉感知系统是具有立体的特性。世界是三维的，3D模型提供了世界及所有物体的全方位、全息的表达，能提供比二维图像更丰富、更全面的空间信息（比如猎鹰能在几公里外判断草地上一只兔子的远近和方位，以便做出下一步的飞行行为）。而单眼（如果以前存在的话）动物则因无法分辨物体的远近，而无情地被自然法则所淘汰。&lt;/p&gt;
&lt;p&gt;计算机视觉通过对图像的理解和分析已经能够解决非常多的任务（比如物体检测、分割、识别、检索等）。但在很多实际应用中，如果涉及到空间关系分析以及与3D环境和物体的理解、交互和创造，则光靠2D图像信息是不够的，此时必须依赖场景的3D信息，比如数字城市中的空间关系分析、机器人抓取3D物体、虚拟和增强现实、物联网数据的空间关联等，如图31所示。在这些应用中，仅仅靠图像信息是无法很快完成各项任务的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image176.jpg&quot; alt=&quot;Image 296&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图31. 三维数据在很多实际应用场景中是必不可少的信息。&lt;/p&gt;
&lt;p&gt;11.2.        3D数据集&lt;/p&gt;
&lt;p&gt;随着3D物体的扫描与采集手段的日益增多（特别是近几年快速发展的深度相机，比如Microsoft Kinect、Intel RealSense、Google Project Tango、Apple Primesense、Asus Xtion等）、未来可采集3D信息的移动终端（去年iPhoneX上已有深度相机）的普及、以及互联网上3D模型的创造与分享，3D数据（包括RGB-D数据）将日益丰富。&lt;/p&gt;
&lt;p&gt;至今，已有许多研究机构构建并公布了一些3D数据集，比如：&lt;/p&gt;
&lt;p&gt;ShapeNet数据集：包含了约300多万个3D模型（3000多类物体），每个模型有语义注释。这是当前最大的一个三维模型数据集；其子集ShapeNetCore具有一些手工的标注；&lt;/p&gt;
&lt;p&gt;ModelNet数据集：包含了12多个3D模型（662类），包含两个子集Model10和ModelNet40；&lt;/p&gt;
&lt;p&gt;ShapeGoogle数据集：包含了近600个非刚性3D模型，用于检索测试；&lt;/p&gt;
&lt;p&gt;SHREC数据集：包含了上千个非刚性3D模型，包括不少人的模型和合成数据集；&lt;/p&gt;
&lt;p&gt;Watch-N-Patch数据集：由Cornell大学和Stanford大学公布，主要是人体3D模型数据。&lt;/p&gt;
&lt;p&gt;还有一些高校和研究机构公开了一些RGB-D数据集，包括Princeton大学（415个室内场景，990万个标记图像），纽约大学（464个室内场景），Cornell大学（24个办公室场景，28个居家室内场景），Washington大学（14个室内场景）等。&lt;/p&gt;
&lt;p&gt;另外，瑞士苏黎世大学发布了一个使用LiDAR（激光3D扫描）扫描的40个办公室场景的高精度3D场景模型数据集。&lt;/p&gt;
&lt;p&gt;11.3.        3D形状描述子&lt;/p&gt;
&lt;p&gt;类似于2D图像，人们也需要对3D模型数据进行分类与识别、分割与建模、匹配与检索等。完成这些任务的关键就是如何定义和计算3D模型的形状描述子（Shape descriptors）或特征（Features）。&lt;/p&gt;
&lt;p&gt;至今，人们已提出了各种基于全局和局部的形状几何属性的空间分布或统计信息的3D形状描述子（如图32所示）。这些形状描述子都是针对某种特定的应用或某些特定的3D模型类型而提出的，同时满足所有应用及所有模型类型的3D形状描述子还没有。在实际应用中，应根据物体类型和具体应用来选择合适的形状描述子（特征选择）。比如，笔者如下论文使用稀疏选择的方法来选择合适的形状描述子用于3D 形状分割。&lt;/p&gt;
&lt;p&gt;[11-1] Ruizhen Hu, Lubin Fan, Ligang Liu.  Co-Segmentation of 3D Shapes via Subspace Clustering. Computer Graphics Forum (Proc. Symposium on Geometry Processing), 31(5): 1703-1713, 2012.&lt;/p&gt;
&lt;p&gt;11.4.        3D几何数据的深度学习的挑战&lt;/p&gt;
&lt;p&gt;随着3D数据（包括单个模型以及场景模型）的日益流行和丰富，如何利用上述丰富的3D数据集来完成分析和处理3D形状数据，已成为研究工作者及产业工作者的关注焦点和研究热点。因此，3D形状的特征提取方法也逐步从上述的人工定义特征方法到基于深度学习的特征学习方法的发展。&lt;/p&gt;
&lt;p&gt;相对于图像与视频处理，3D几何数据的深度学习方法在近几年才开始有了一些工作和进展，但仍面临着一些挑战。&lt;/p&gt;
&lt;p&gt;(1)   3D数据集较小&lt;/p&gt;
&lt;p&gt;相比于ImageNet等千万级数据量的2D图像数据集，现在的3D模型数据集的数量很少，仍未达到“大数据”的规模。另外，3D数据的标注也是较为困难的。&lt;/p&gt;
&lt;p&gt;(2)   3D数据是非结构化的&lt;/p&gt;
&lt;p&gt;图像和视频都是结构化数据，是线性结构的，可以表达为一个向量或矩阵。但3D模型数据是非结构化的（如图33所示），每个顶点的邻域数是非固定的，从拓扑上看是一个图（Graph），无法直接使用深度神经网络。&lt;/p&gt;
&lt;p&gt;(3)   3D数据的复杂性&lt;/p&gt;
&lt;p&gt;相对于图像和视频，3D模型还有其他一些复杂性，包括：&lt;/p&gt;
&lt;p&gt;(a) 正向姿态性：图像基本都是正向拍摄的，但是3D模型的姿态可以是任意的，如何消除姿态的影响仍有挑战。为了方便，一般会预先将数据集中的模型统一正朝向；&lt;/p&gt;
&lt;p&gt;(b) 表达不统一：图像就是一个矩阵结构，表达非常统一；但是3D模型有不同的表达方式，比如点云、网格、体素、隐函数、CSG树等（如图34），使得需要对不同表达的数据进行不同的处理；&lt;/p&gt;
&lt;p&gt;(c) 数据不完整：由于采集设备的精度问题，有些3D数据（比如RGBD数据）中存在着大量的噪声和游离点；由于遮挡关系，有些3D数据不够完全，存在着空洞；还有些3D数据的采样密度不均匀，造成不同部位的信息不对称。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image177.jpg&quot; alt=&quot;Image 297&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image178.jpg&quot; alt=&quot;Image 298&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图32. 各种人工3D形状描述子。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image179.jpg&quot; alt=&quot;Image 299&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图33. 二维图像与三维网格的数据结构的区别。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image180.jpg&quot; alt=&quot;Image 300&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图34. 三维几何数据的不同表达。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;十二、&lt;/strong&gt;        &lt;strong&gt;智能图形处理：三维数据的深度学习&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;3D图形作为一种新型的可视媒体数据类型，同样可以利用人工智能和深度学习的方法来进行分析和处理，融合大数据、并行计算及人工智能技术的最新进展以提高计算机图形学算法及系统易用性及效率，称为智能图形处理。&lt;/p&gt;
&lt;p&gt;近几年，已有越来越多的研究工作将机器学习和深度学习的方法应用于3D数据。本节仅就3D形状描述子方面做一个简略的介绍。&lt;/p&gt;
&lt;p&gt;应用深度学习来自动抽取3D形状特征主要有以下3种方法：第一种，基于传统的人工特征（维数一致了）来进行更抽象的形状特征的学习和抽取；这种方法是非端到端的；第二种，将3D数据转化为规整结构数据（欧氏区域），然后再应用深度学习方法抽取形状特征，称为显式方法；第三种，将深度神经网络改造成能够处理非欧氏区域数据，称为隐式方法。下面分别从方法论上进行简单介绍。&lt;/p&gt;
&lt;p&gt;12.1.        基于人工特征的特征学习方法&lt;/p&gt;
&lt;p&gt;由于传统卷积无法直接作用于3D形状，早期的方法避开了直接以3D形状作为输入的训练，而是先从3D模型中提取一些人工特征（称为低级特征，如图32），再把这些特征输入到神经网络中进行学习，获得新的抽象特征（称为高级特征），如图35所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image181.jpg&quot; alt=&quot;Image 301&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图35. 基于人工特征的特征学习方法。&lt;/p&gt;
&lt;p&gt;[12-1] Zhige Xie, Kai Xu, Ligang Liu, Yueshan Xiong. 3D Shape Segmentation and Labeling via Extreme Learning Machine. Computer Graphics Forum (Proc. SGP), 33(5): 85-95, 2014.&lt;/p&gt;
&lt;p&gt;[12-2] Kan Guo, Dongqing Zou, and Xiaowu Chen. 3D mesh labeling via deep convolutional neural networks. ACM Transactions on Graphics, 35, 1, 2015.&lt;/p&gt;
&lt;p&gt;[12-3] Zhenyu Shu, Chengwu Qi, Shiqing Xin, Chao Hu, Li Wang, Yu Zhang, Ligang Liu. Unsupervised 3D Shape Segmentation and Co-segmentation via Deep Learning. Computer Aided Geometric Design (Proc. GMP), 43: 39-52, 2016.&lt;/p&gt;
&lt;p&gt;人工定义的特征很大程度上取决于人的经验。因此，基于人工特征的特征学习方法并不是端到端的深度学习方法。另外，各种人工特征向量的排列也会改变特征矩阵及其卷积后的结果，对结果产生如何的影响也不清楚。&lt;/p&gt;
&lt;p&gt;12.2.        非本征方法&lt;/p&gt;
&lt;p&gt;这种方法是将3D数据进行合适的变换，将其变换到一个欧氏空间的规则区域，以便适用于深度神经网络。此类方法改变了3D网格模型的形态，本质上也改变了数据分布空间，是为了适应传统CNN或MLP对拓扑的要求而提出的折衷解决方法，因此成为基于欧氏空间的学习方法或非本征方法，如图36所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image182.jpg&quot; alt=&quot;Image 302&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图36. 非本征深度学习方法。&lt;/p&gt;
&lt;p&gt;变换的区域和方法主要有以下几种。&lt;/p&gt;
&lt;p&gt;(1)   图像区域。最简单的方法就是将3D模型数据投影到平面形成图像。&lt;/p&gt;
&lt;p&gt;(a)    多视图图像：将3D模型往多个视角方向投影生成多幅图像，比如[12-4, 12-5]；&lt;/p&gt;
&lt;p&gt;(b)   全景图像：将3D模型往平面投影生成一幅全景图，比如[12-6]；&lt;/p&gt;
&lt;p&gt;(c)    参数化图像：将3D模型的2D参数化看成为一幅图像，比如[12-7, 12-8]。&lt;/p&gt;
&lt;p&gt;(2)   体素区域。&lt;/p&gt;
&lt;p&gt;(a)    类比于图像中的像素，将3D形状看作三维体素网格的0，1分布，比如[12-9, 12-10， 12-11]。由于体素的个数是三次方增长，因此，体素的分辨率无法太大，一般连128x128x128的分辨率做起来都很困难。&lt;/p&gt;
&lt;p&gt;(b)   只将模型表面用体素来表达，而省去内部体素的存储，并且利用八叉树的形式来存储，可以有效地提高体素的分辨率及模型的表达精度，比如[12-12]。&lt;/p&gt;
&lt;p&gt;(3)   基元组合。三维形状还可以表示成一些基本单元的组合，如矩形块、圆柱、圆锥、球等，然后利用网络来学习这些基本体块的参数，比如[12-13, 12-14]。&lt;/p&gt;
&lt;p&gt;(4)   点云。直接将3D数据看成点的集合。将每个点看作一个神经元节点，节点包含点的坐标或法向等信息，然后利用深度神经网络提取点的特征。这里要克服点及点邻域的顺序无关性等。比如[12-14, 12-15, 12-16, 12-18]。&lt;/p&gt;
&lt;p&gt;[12-4] Su, H. and S. Maji, et al. (2015). Multi-view convolutional neural networks for 3D shape recognition. ICCV.&lt;/p&gt;
&lt;p&gt;[12-5] Xie, Z. and K. Xu, et al. (2015). Projective Feature Learning for 3D Shapes with Multi‐View Depth Images. CGF.&lt;/p&gt;
&lt;p&gt;[12-6] Shi, B. and S. Bai, et al. (2015). Deeppano: Deep panoramic representation for 3‐D shape recognition. IEEE Signal Processing Letters.&lt;/p&gt;
&lt;p&gt;[12-7] Sinha, A., Bai, J., Ramani, K., et al. (2016). Deep learning 3D shape surfaces using geometry images. ECCV.&lt;/p&gt;
&lt;p&gt;[12-8] Maron, H. and Galun, M. (2017). Convolutional Neural Networks on Surfaces via Seamless Toric Covers. SIGGRAPH.&lt;/p&gt;
&lt;p&gt;[12-9] Qi, C. R. and H. Su, et al. (2016). Volumetric and multi-view cnns for object classification on 3D data. CVPR.&lt;/p&gt;
&lt;p&gt;[12-10] Brock, A. and T. Lim, et al. (2016). Generative and discriminative voxel modeling with convolutional neural networks. NIPS.&lt;/p&gt;
&lt;p&gt;[12-11] Wu, Z., and Song, S. et al. (2015). 3d shapenets: a deep representation for volumetric shapes. CVPR.&lt;/p&gt;
&lt;p&gt;[12-12] Wang, P. S.  and Liu, Y. et al. (2017). O-cnn: octree-based convolutional neural networks for 3d shape analysis. TOG.&lt;/p&gt;
&lt;p&gt;[12-13] J. Li, K. Xu, et al. Grass: Generative recrusive autoencoders for shape structures. ACM Trans. on Graph., 36(4), 2017.&lt;/p&gt;
&lt;p&gt;[12-14] S. Tulsiani et al. Learning shape abstraction by assembling volumetric primitives. CVPR, 2017.&lt;/p&gt;
&lt;p&gt;[12-15] Garcia-Garcia, A. and Gomez-Donoso, F. et al. (2016). PointNet: A 3D Convolutional Neural Network for real-time object class recognition. IJCNN.&lt;/p&gt;
&lt;p&gt;[12-16] Qi, C. R. and H. Su, et al. (2017). PointNet: Deep learning on point sets for 3D classification and segmentation. CVPR.&lt;/p&gt;
&lt;p&gt;[12-17] Qi, C. R. and Yi, L. et al. (2017). PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space. CVPR.&lt;/p&gt;
&lt;p&gt;[12-18] Yangyan Li, Rui Bu, Mingchao Sun, and Baoquan Chen (2018). PointCNN. arXiv:1801.07791.&lt;/p&gt;
&lt;p&gt;12.3.        本征方法&lt;/p&gt;
&lt;p&gt;本征方法直接将三维形状看成二维流形（Manifold）或由点组成的图（Graph），顶点之间的距离不再是欧氏距离，然后直接将卷积定义在这样的数据结构上，称为非欧氏空间学习的方法或本征方法，如图37。两种典型的网络为测地卷积网络（Geodesic CNN, GCNN）和图卷积网络（Graph-based CNN），如图38，可参考[12-19, 12-20, 12-21, 12-22]。&lt;/p&gt;
&lt;p&gt;[12-19] Masci, J. and Boscaini, D. et al. (2015). Geodesic convolutional neural networks on Riemannian manifolds. ICCV.&lt;/p&gt;
&lt;p&gt;[12-20] Monti, F. and Boscaini, D., Masci. (2016). Geometric deep learning on graphs and manifolds using mixture model CNNs. arXiv preprint arXiv:1611.08402.&lt;/p&gt;
&lt;p&gt;[12-21] Boscaini, D. and Masci, J. et al. (2016). Learning shape correspondence with anisotropic convolutional neural networks. NIPS.&lt;/p&gt;
&lt;p&gt;[12-22] Yi, L. and Su, H. et al. (2017). Syncspeccnn: Synchronized spectral CNN for 3d shape segmentation. CVPR.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image183.jpg&quot; alt=&quot;Image 303&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图37. 本征深度学习方法。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image184.jpg&quot; alt=&quot;Image 304&quot; /&gt;    &lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image185.jpg&quot; alt=&quot;Image 305&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图38. 本征深度学习的具体方法。左：测地卷积；右：图卷积网络。&lt;/p&gt;
&lt;p&gt;12.4.        端到端的生成模型&lt;/p&gt;
&lt;p&gt;在上面的工作中，深度学习用于解决3D形状的识别、分割、匹配和对应等问题。近年来，越来越多的工作致力于3D 模型的构建和生成（大部分都是使用生成-对抗网络GAN）。由于可以自动生成大量的3D模型，对于扩充3D模型数据集具有重要的意义，非常值得大家关注。&lt;/p&gt;
&lt;p&gt;这里简略介绍一下端到端的3D模型生成的一些工作。所谓端到端的生成模型，就是输入是简单易获得的，输出是三维模型，中间无需其他操作。例如，可以从输入的一张照片输出三维体素模型[12-23, 12-24]、点云模型[12-25]、或者网格模型及其参数化[12-26]；[12-27]利用级联的图卷积网络由粗到精逐渐细化网格模型；[12-28]由手绘草图生成参数化的夸张人脸模型。&lt;/p&gt;
&lt;p&gt;[12-23] J. Wu et al. Learning a probabilistic latent space of object shapes via 3D generative-adversarial modeling. Advances in Neural Information Processing Systems, 82-90, 2016.&lt;/p&gt;
&lt;p&gt;[12-24] J. Li et al. Grass: Generative recursive autoencoders for shape structures. Siggraph 2017.&lt;/p&gt;
&lt;p&gt;[12-25] H. Fan et al. A point set generation network for 3D object reconstruction from a single image. CVPR 2017.&lt;/p&gt;
&lt;p&gt;[12-26] T. Groueix et al. AltasNet: A papier approach to learning 3D surface generation. arXiv: 1802.05384, 2018.&lt;/p&gt;
&lt;p&gt;[12-27] N. Wang et al. Pixel2Mesh: Generating 3D mesh models form single RGB iamges. arXiv: 1804.01654.&lt;/p&gt;
&lt;p&gt;[12-28] X. Han et al. DeepSketch2Face: A deep learning based sketching systems for 3D face and caricature modeling. Siggraph 2017.&lt;/p&gt;
&lt;p&gt;【后记】&lt;/p&gt;
&lt;p&gt;此文分享了笔者对基于深度神经网络的深度学习的理解，从逼近论的角度深入浅出地理解了深度学习的原理，了解了整个调试深度网络的“炼丹”过程，是个需要丰富经验的“技术活”。机器学习还有很多其他重要的方法，比如非监督学习和强化学习等，笔者就不一一进行介绍了。&lt;/p&gt;
&lt;p&gt;从本文的分析可知，基于深度神经网络的深度学习背后的运行原理主要基于数据驱动的函数拟合，采用的是“经验主义”的实用方法（比如数学中的最小二乘方法及统计学中的统计回归方法等）；它离真正的人工智能，即能通过图灵测试（Turing Testing）的智能机器还很远。从数学本质上来看，现在基于数据的深度学习方法实质上只有“记忆”能力，并没有对问题的“理解”能力，更没有 人们所期待的“人类智能”。&lt;/p&gt;
&lt;p&gt;从研究的方法论来看，对于要研究的对象（信息或数据），如果在不同的空间（角度）来观察会有对该对象有不同的理解和认知（比如信号处理中，在时域和频域的变换下的Fourier分析），即对象在该空间中所表现的“特征”。因此，&lt;strong&gt;在不同的空间进行变换&lt;/strong&gt;就成为关键的步骤之一。在以往的研究中，需要研究者对对象有深刻的理解来对信息进行特定的变换（即在特定的基函数的变换下）。而深度神经网络实现了端到端的变换，通过多层（深度）复合的变换（多次变换）自动提取了在不同空间的“特征”，即根据数据本身自适应“学习”基函数。这是深度神经网络的巨大优势之一。另外，深度神经网络的另一个巨大优势就是可以通过数量众多的小函数（激活函数）的线性变换及复合来逼近非常复杂的函数，解决了人工设计基函数的困难。因此，基于深度神经网络的深度学习具有非常广泛的实际应用。另外值得一提的是，从Fourier变换到小波变换的发展来看，可以将神经网络中的激活函数变为特殊的局部基函数，使得比现有的全局激活函数适用于更广泛的函数（比如瞬时信号函数），将来再抽时间来详细分析和阐述。&lt;/p&gt;
&lt;p&gt;从计算数学领域来看，&lt;strong&gt;神经网络提供了可以构建任意维度之间的映射和函数&lt;/strong&gt;，这是传统逼近论所无法做到的。这使得人们研究的数据维度和数据类型极大的丰富了，而不只是对1维和2维等低维数据进行分析和处理。这将是一个非常重要的方法论，将对科学领域的研究方法、手段和进展也具有极大的促进和推动作用。有理由相信，深度学习方法（或人工智能方法）将会被当作计算数学、应用科学的计算工具或科研工具，催生新的科研范式，被越来越多地用来解决一些计算数学和其他科学领域中的问题。&lt;/p&gt;
&lt;p&gt;从方法论来看，也可以从&lt;strong&gt;统计学的角度&lt;/strong&gt;来看深度神经网络，将深度神经网络来拟合数据的分布（分布函数），比如生成网络和GAN等，也是近期研究的热点。在本文中对此方法论没有进行展开。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image186.jpg&quot; alt=&quot;Image 306&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图39. Gartner 2018人工智能技术成熟度曲线。（图片来源于互联网）&lt;/p&gt;
&lt;p&gt;五年前（2013年4月），《麻省理工学院技术评论》杂志将深度学习列为2013年十大突破性技术（Breakthrough Technology）之首。经过前几年的高速发展，根据Gartner在7月刚发布的2018人工智能技术成熟度曲线（如图39），深度神经网络及深度学习已从前几年的爬坡阶段到达顶部。未来，相信人们将会更冷静地来看待及发展相关的技术和应用。&lt;/p&gt;
&lt;p&gt;最近，有人提出“可微编程（Differentiable Programming）”的概念，就是将神经网络当成一种语言（而不是一个简单的机器学习的方法），来描述我们客观世界的规律。甚至Yann LeCun曾在Facebook的文章中说道：“Deep Learning Is Dead. Long Live Differentiable Programming!”（深度学习已死，可微编程永生） 这个概念的提出又将神经网络提高了一个层次。&lt;/p&gt;
&lt;p&gt;本文完稿核对时，笔者发现文中有些数学符号（比如&lt;img src=&quot;./%E4%BB%8E%E5%87%BD%E6%95%B0%E9%80%BC%E8%BF%91%E8%AE%BA%E7%9C%8B%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0.assets/image187.png&quot; alt=&quot;Image 307&quot; /&gt;等）存在着重复定义与使用，但根据上下文并不影响阅读和理解，因此笔者就不花时间去修正了，在此说明下。&lt;/p&gt;
&lt;p&gt;再次声明下，笔者的主要研究领域为&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu/Resources/CG/What_is_CG.htm&quot;&gt;计算机图形学&lt;/a&gt;，而非人工智能领域，因此本文仅仅为笔者从外行的角度对基于深度神经网络的深度学习的粗浅理解，而非人工智能领域对深度神经网络和深度学习的权威解释。笔者对其中的有些内容的理解是有限的，甚至是有误的。因此，该文仅供读者参考，不作为专业资料！如有不当之处，还请读者指正！&lt;/p&gt;
&lt;p&gt;【致谢】&lt;/p&gt;
&lt;p&gt;笔者在学习深度神经网络及深度学习的过程中，阅读了许多相关的书籍和论文（比如周志华老师的《机器学习》一书和李宏毅老师的课件等）以及微信订阅号（比如《SigAI》、《人工智能学家》、《深度学习大讲堂》、《老顾谈几何》等），在此表示感谢。也感谢舒振宇、徐凯、韩晓光、沈小勇、胡瑞珍等同行、以及笔者实验室的同事（张举勇、傅孝明、杨周旺等）和学生（陈明佳、方清、杜冬、石磊、欧阳文清、刘中远等），与他们的交流和讨论也让笔者受益匪浅。&lt;/p&gt;
&lt;p&gt;最后，希望您能从本文受益。祝您健康、快乐、成功！&lt;/p&gt;
&lt;p&gt;刘利刚&lt;/p&gt;
&lt;p&gt;中国科学技术大学图形与几何计算实验室(&lt;a href=&quot;http://gcl.ustc.edu.cn/&quot;&gt;http://gcl.ustc.edu.cn&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;个人主页：&lt;a href=&quot;http://staff.ustc.edu.cn/~lgliu&quot;&gt;http://staff.ustc.edu.cn/~lgliu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;电子邮箱：&lt;a href=&quot;mailto:lgliu@ustc.edu.cn&quot;&gt;lgliu@ustc.edu.cn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2018年8月8日&lt;/p&gt;
</content:encoded></item><item><title>输出网络参数和网络结构</title><link>https://tuoyuangui.github.io/website/posts/typora/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E8%BE%93%E5%87%BA%E4%B8%AD%E9%97%B4%E5%8F%82%E6%95%B0%E5%92%8C%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E8%BE%93%E5%87%BA%E4%B8%AD%E9%97%B4%E5%8F%82%E6%95%B0%E5%92%8C%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84/</guid><pubDate>Tue, 12 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;输出网络参数和网络结构&lt;/h1&gt;
&lt;h2&gt;1、 输出网络参数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;\n\nprint the each layer&apos;s name(GAB)&quot;)
for name in G_AB.state_dict():
  print(name)
print(&quot;\n\nprint the name and the size of layers&quot;)
for name,parameters in G_AB.named_parameters():
  print(name,&quot;;&quot;,parameters.size())
print(&quot;\n\nsave the parameters&quot;)
for layer in [&apos;model.1.freq&apos;,&apos;model.1.theta&apos;,&apos;model.1.sigma&apos;,&apos;model.1.psi&apos;,&apos;model.1.x&apos;,&apos;model.1.y&apos;,&apos;model.1.weight&apos;]:
  print(&quot;\n&quot;,layer)
  print(G_AB.state_dict()[layer])
  G_AB.state_dict()[layer].cpu().detach().numpy().tofile(layer[8:]+&apos;.rsf@&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、输出网络结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;from torchinfo import summary
summary(G_AB,input_size=(16,1,256,256))
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>离散余弦变换DCT</title><link>https://tuoyuangui.github.io/website/posts/typora/%E6%95%B0%E5%AD%A6%E6%96%B9%E6%B3%95/%E7%A6%BB%E6%95%A3%E4%BD%99%E5%BC%A6%E5%8F%98%E6%8D%A2dct/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E6%95%B0%E5%AD%A6%E6%96%B9%E6%B3%95/%E7%A6%BB%E6%95%A3%E4%BD%99%E5%BC%A6%E5%8F%98%E6%8D%A2dct/</guid><pubDate>Sun, 12 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;离散余弦变换DCT&lt;/h1&gt;
&lt;h2&gt;1、&lt;strong&gt;离散余弦变换&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;​		&lt;strong&gt;离散余弦变换&lt;/strong&gt;（&lt;strong&gt;discrete cosine transform, DCT&lt;/strong&gt;）是与&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2&quot;&gt;傅里叶变换&lt;/a&gt;相关的一种变换，类似于&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E7%A6%BB%E6%95%A3%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2&quot;&gt;离散傅里叶变换&lt;/a&gt;，但是只使用&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%AE%9E%E6%95%B0&quot;&gt;实数&lt;/a&gt;。离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换，这个离散傅里叶变换是对一个实&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%81%B6%E5%87%BD%E6%95%B0&quot;&gt;偶函数&lt;/a&gt;进行的（因为一个实偶函数的傅里叶变换仍然是一个实偶函数），在有些变形里面需要将输入或者输出的位置移动半个单位。这是由于离散余弦变换具有很强的&quot;能量集中&quot;特性：大多数的自然信号（包括声音和图像）的能量都集中在离散余弦变换后的低频部分，而且当信号具有接近&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E8%BF%87%E7%A8%8B&quot;&gt;马尔可夫过程&lt;/a&gt;的统计特性时，离散余弦变换的去相关性接近于&lt;a href=&quot;https://zh.wikipedia.org/w/index.php?title=K-L%E5%8F%98%E6%8D%A2&amp;amp;action=edit&amp;amp;redlink=1&quot;&gt;K-L变换&lt;/a&gt;（Karhunen-Loève变换——它具有最优的去相关性）的性能。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./%E7%A6%BB%E6%95%A3%E4%BD%99%E5%BC%A6%E5%8F%98%E6%8D%A2DCT.assets/image-20240528214620374.png&quot; alt=&quot;image-20240528214620374&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一个401*3001炮集利用DCT实现数据重构，J(450:end,:) = 0; 数据量（3001-&amp;gt;450;15%）&lt;/p&gt;
&lt;p&gt;​                        &lt;img src=&quot;./%E7%A6%BB%E6%95%A3%E4%BD%99%E5%BC%A6%E5%8F%98%E6%8D%A2DCT.assets/image-20240528214651085.png&quot; alt=&quot;image-20240528214651085&quot; /&gt;             &lt;img src=&quot;./%E7%A6%BB%E6%95%A3%E4%BD%99%E5%BC%A6%E5%8F%98%E6%8D%A2DCT.assets/image-20240528214655491.png&quot; alt=&quot;image-20240528214655491&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E7%A6%BB%E6%95%A3%E4%BD%99%E5%BC%A6%E5%8F%98%E6%8D%A2&quot;&gt;离散余弦变换 - 维基百科，自由的百科全书 (wikipedia.org)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>VIM基本操作</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/vim%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/vim%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/</guid><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;VIM基本操作&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;跳转到指定行：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 88G （命令模式）
2. :88  (末行模式)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;跳转文件首：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gg （命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;跳转文件尾：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;G（命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;自动格式化程序：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gg=G（命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;大括号对应：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% （命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;光标移至行首：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 （命令模式）执行结束，工作模式不变。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;光标移至行尾：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ （命令模式）执行结束，工作模式不变。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除单个字符：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x （命令模式）执行结束，工作模式不变。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;替换单个字符：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;将待替换的字符用光标选中， r （命令模式），再按欲替换的字符
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除一个单词：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dw（命令模式）光标置于单词的首字母进行操作。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除光标至行尾：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;D 或者 d$（命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除光标至行首：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;d0 （命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除指定区域：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;按 V （命令模式）切换为 “可视模式”，使用 hjkl挪移光标来选中待删除区域。  按 d 删除该区域数据。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除指定1行：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;在光标所在行，按 dd （命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除指定N行：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;在光标所待删除首行，按 Ndd （命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;复制一行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;粘贴：&lt;/strong&gt;
p：向后、P：向前。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;查找：&lt;/strong&gt;
1. 找 设想 内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    命令模式下， 按 “/” 输入欲搜索关键字，回车。使用 n 检索下一个。

2. 找 看到的内容：

    命令模式下，将光标置于单词任意一个字符上，按 “*”/ “#”
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;单行替换：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;将光标置于待替换行上， 进入末行模式，输入 :s /原数据/新数据
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;通篇替换：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;末行模式， :%s /原数据/新数据/g   g:不加，只替换每行首个。   sed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指定行的替换：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;末行模式， :起始行号，终止行号s /原数据/新数据/g   g:不加，只替换每行首个。

    :29,35s /printf/println/g
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;撤销、反撤销：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;u、ctrl+r（命令模式）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;分屏：&lt;/strong&gt;
sp：横屏分。 Ctrl+ww 切换。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vsp：竖屏分。Ctrl+ww 切换。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;跳转至 man 手册：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;将光标置于待查看函数单词上，使用 K（命令模式）跳转。 指定卷， nK
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;查看宏定义：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;将光标置于待查看宏定义单词上，使用 [d 查看定义语句。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;在末行模式执行shell命令：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:!命令        :! ls -l
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>C语言索引遍历探究</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/c%E8%AF%AD%E8%A8%80%E7%B4%A2%E5%BC%95%E9%81%8D%E5%8E%86%E6%8E%A2%E7%A9%B6/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/c%E8%AF%AD%E8%A8%80%E7%B4%A2%E5%BC%95%E9%81%8D%E5%8E%86%E6%8E%A2%E7%A9%B6/</guid><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;C语言索引遍历探究&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# include &quot;alloc_function.h&quot;
# include &amp;lt;stdio.h&amp;gt;
# include &amp;lt;stdlib.h&amp;gt;
# include &amp;lt;string.h&amp;gt;
#include &amp;lt;limits.h&amp;gt;
# define TIMES 21

int main()
{
    clock_t t0, t1, t2;
    float *arr1d;
    float ***arr3d;
    float time_r;
    float sum;
    float *pointer;
    size_t N1=2000;
    size_t N2=1000;
    size_t N3=50;
    arr1d = alloc1float(N1*N2*N3);
    arr3d = alloc3float(N1,N2,N3);
    size_t N = N1*N2*N3;
    printf(&quot;N=%ld\n&quot;, N);
    printf(&quot;size_t=[0,%u]\n&quot;, UINT_MAX);
    printf(&quot;int   =[%d,%d]\n&quot;, INT_MIN, INT_MAX);

    // 1D array
    time_r=0.0f;
    for(size_t time=0; time&amp;lt;TIMES; time++){
        t0 = clock();
        sum = 0.0f;
        for(size_t i=0; i&amp;lt;N; i++)
        {
            arr1d[i] = 1e-6f;
            sum += arr1d[i];
        }
        t1 = clock();
        if (time&amp;gt;0)
        time_r += (float)(t1-t0)/1000000.0;
    }
    printf(&quot;1D array: %f \t %f\n&quot;, time_r,sum);

    // 1D array pointer
    time_r=0.0f;
    for(size_t time=0; time&amp;lt;TIMES; time++){
        t0 = clock();
        sum = 0.0f;
        for(pointer = arr1d; pointer&amp;lt;arr1d+N; pointer++)
        {
            *pointer = 1e-6f;
            sum += *pointer;
        }
        t1 = clock();
        if (time&amp;gt;0)
        time_r += (float)(t1-t0)/1000000.0;
    }
    printf(&quot;1D array pointer: %f \t %f \n&quot;, time_r, sum);

    // 3D array Nonequential read
    time_r=0.0f;
    for(size_t time=0; time&amp;lt;TIMES; time++){
        t0 = clock();
        sum = 0.0f;

        for(size_t i=0; i&amp;lt;N1; i++)
        {
            for(size_t j=0; j&amp;lt;N2; j++)
            {
                for(size_t k=0; k&amp;lt;N3; k++){
                    arr3d[k][j][i] = 1e-6f;
                    sum += arr3d[k][j][i];
                }
            }
        }
        t1 = clock();
        if (time&amp;gt;0)
        time_r += (float)(t1-t0)/1000000.0;
    }
    printf(&quot;3D array Nonequential: %f \t %f\n&quot;, time_r, sum);

    // 3D array Sequential read
    time_r=0.0f;
    for(size_t time=0; time&amp;lt;TIMES; time++){
        t0 = clock();
        sum = 0.0f;

        for(size_t k=0; k&amp;lt;N3; k++)
        {
            for(size_t j=0; j&amp;lt;N2; j++)
            {
                for(size_t i=0; i&amp;lt;N1; i++){
                    arr3d[k][j][i] = 1e-6f;
                    sum += arr3d[k][j][i];
                }
            }
        }
        t1 = clock();
        if (time&amp;gt;0)
        time_r += (float)(t1-t0)/1000000.0;
    }
     printf(&quot;3D array Sequential: %f \t %f\n&quot;, time_r, sum);

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;运行结果&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./C%E8%AF%AD%E8%A8%80%E7%B4%A2%E5%BC%95%E9%81%8D%E5%8E%86%E6%8E%A2%E7%A9%B6.assets/image-20240530225127503.png&quot; alt=&quot;image-20240530225127503&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;使用指针遍历，要比索引块快&lt;code&gt;%5&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;非顺序读写耗时约为顺序读写的&lt;code&gt;2.5倍&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;多维数组，没有一维数组快。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h4&gt;&lt;a href=&quot;./C%E8%AF%AD%E8%A8%80%E7%B4%A2%E5%BC%95%E9%81%8D%E5%8E%86%E6%8E%A2%E7%A9%B6.assets/test_speed.tar.gz&quot;&gt;实现代码&lt;/a&gt;&lt;/h4&gt;
</content:encoded></item><item><title>C语言中的int main(int argc,char argv[]的含义和用法</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/argc%E5%92%8Cargv%E7%9A%84%E4%BD%9C%E7%94%A8/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/argc%E5%92%8Cargv%E7%9A%84%E4%BD%9C%E7%94%A8/</guid><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;C语言中的int main(int argc,char* argv[]的含义和用法&lt;/h1&gt;
&lt;hr /&gt;
&lt;h4&gt;1、基本概念&lt;/h4&gt;
&lt;p&gt;　　argc,argv 用&lt;a href=&quot;https://baike.baidu.com/item/%E5%91%BD%E4%BB%A4%E8%A1%8C&quot;&gt;命令行&lt;/a&gt;编译程序时有用。&lt;/p&gt;
&lt;p&gt;　　主函数main中变量(int argc,char *argv[ ])的含义，有些&lt;a href=&quot;https://baike.baidu.com/item/%E7%BC%96%E8%AF%91%E5%99%A8&quot;&gt;编译器&lt;/a&gt;允许将main()的返回类型声明为void，这已不再是合法的C++&lt;/p&gt;
&lt;p&gt;　　&lt;code&gt;main(int argc, char *argv[ ], char **env)&lt;/code&gt; 才是&lt;a href=&quot;https://baike.baidu.com/item/UNIX&quot;&gt;UNIX&lt;/a&gt;和&lt;a href=&quot;https://baike.baidu.com/item/Linux&quot;&gt;Linux&lt;/a&gt;中的标准写法。&lt;/p&gt;
&lt;p&gt;　　　　argc: 整数,用来统计你运行程序时送给&lt;a href=&quot;https://baike.baidu.com/item/main%E5%87%BD%E6%95%B0&quot;&gt;main函数&lt;/a&gt;的&lt;a href=&quot;https://baike.baidu.com/item/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0&quot;&gt;命令行参数&lt;/a&gt;的个数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;argv[ ]: 指针&lt;a href=&quot;https://baike.baidu.com/item/%E6%95%B0%E7%BB%84&quot;&gt;数组&lt;/a&gt;，用来存放指向你的字符串参数的指针，每一个元素指向一个参数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;　　　　argv[0] 指向程序运行的全路径名&lt;/p&gt;
&lt;p&gt;　　　　argv[1] 指向在DOS命令行中执行程序名后的第一个字符串&lt;/p&gt;
&lt;p&gt;　　　　argv[2] 指向执行程序名后的第二个字符串&lt;/p&gt;
&lt;p&gt;　　　　...&lt;/p&gt;
&lt;p&gt;　　　　argv[argc]为NULL。&lt;/p&gt;
&lt;p&gt;　　　　&lt;strong&gt;env&lt;/strong&gt;：字符串数组。env[ ]的每一个元素都包含ENVVAR=value形式的字符串。其中ENVVAR为环境变量，value 为ENVVAR的对应值。&lt;/p&gt;
&lt;p&gt;　　argc, argv,env是在main( )函数之前被赋值的，&lt;a href=&quot;https://baike.baidu.com/item/%E7%BC%96%E8%AF%91%E5%99%A8&quot;&gt;编译器&lt;/a&gt;生成的&lt;a href=&quot;https://baike.baidu.com/item/%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6&quot;&gt;可执行文件&lt;/a&gt;，main( )不是真正的入口点，而是一个标准的函数,这个函数名与具体的操作系统有关。&lt;/p&gt;
&lt;h4&gt;2、具体用法&lt;/h4&gt;
&lt;p&gt;　　经典例子&lt;/p&gt;
&lt;p&gt;　　对于理解argv[ ]函数很管用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* xx.c */
#include&amp;lt;stdio.h&amp;gt;
int main(int argc,char *argv[])
{
    int i;
    if(argc==1)
        printf(&quot;only get the program!\n&quot;);
    if(argc&amp;gt;2)
    for(i=1;i&amp;lt;argc;i++)
           printf(&quot;inputfile[%d]:%s\n&quot;,i+1,argv[i]);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　编译运行结果如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ubuntu@ubuntu:~/DATA/others$ gcc xx.c -o lgl
ubuntu@ubuntu:~/DATA/others$ ./lgl
only get the program!
ubuntu@ubuntu:~/DATA/others$ ./lgl xx 123 zls2
inputfile[2]:xx
inputfile[3]:123
inputfile[4]:zls2
ubuntu@ubuntu:~/DATA/others$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　main(int argc, char* argv[ ])，其中argc是指变量的个数，本例中即指test和hello这两个变量和程序运行的全路径名或程序的名字，argc即为3。&lt;/p&gt;
&lt;p&gt;　　argv是一个char *的数组，其中存放指向参数变量的指针，此处argv[0]指向test.exe的全路径名或test.exe，argv[1]指向test，argv[2]指向hello。&lt;/p&gt;
&lt;h2&gt;3、实例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;/*test_main.c*/
#include &amp;lt;stdio.h&amp;gt;

int main(int argc, char *argv[])
{
  printf(&quot;%d\n&quot;,argc);
  printf(&quot;\n&quot;);
  printf(&quot;%s\n&quot;,argv[0]);
  printf(&quot;%s\n&quot;,argv[1]);
  printf(&quot;%s\n&quot;,argv[2]);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;编译运行&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./test_main.o wan tu sirui
$ ./test_main.o
wan
Tu
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://www.cnblogs.com/hxing/p/10052828.html&quot;&gt;int main(int argc,char* argv[]) 的含义和用法 - hxing - 博客园 (cnblogs.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;【2】https://blog.csdn.net/qq_37212828/article/details/103153208&lt;/p&gt;
</content:encoded></item><item><title>C 头文件重复定义问题</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/%E5%A4%B4%E6%96%87%E4%BB%B6%E9%87%8D%E5%A4%8D%E5%AE%9A%E4%B9%89/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/%E5%A4%B4%E6%96%87%E4%BB%B6%E9%87%8D%E5%A4%8D%E5%AE%9A%E4%B9%89/</guid><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;C 头文件重复定义问题&lt;/h1&gt;
&lt;p&gt;​	头文件是扩展名为 &lt;strong&gt;.h&lt;/strong&gt; 的文件，包含了 C 函数声明和宏定义，被多个源文件中引用共享。有两种类型的头文件：程序员编写的头文件和编译器自带的头文件。在程序中要使用头文件，需要使用 C 预处理指令 &lt;code&gt;#include &lt;/code&gt;来引用它。前面我们已经看过 &lt;strong&gt;stdio.h&lt;/strong&gt; 头文件，它是编译器自带的头文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;引用头文件相当于复制头文件的内容&lt;/strong&gt;，但是我们不会直接在源文件中复制头文件的内容，因为这么做很容易出错，特别在程序是由多个源文件组成的时候。&lt;/p&gt;
&lt;p&gt;A simple practice in C 或 C++ 程序中，建议把所有的常量、宏、系统全局变量和函数原型写在头文件中，在需要的时候随时引用这些头文件。&lt;/p&gt;
&lt;p&gt;使用预处理指令 &lt;strong&gt;#include&lt;/strong&gt; 可以引用用户和系统头文件。它的形式有以下两种：&lt;/p&gt;
&lt;p&gt;这种形式用于引用系统头文件。它在系统目录的标准列表中搜索名为 file 的文件。在编译源代码时，您可以通过&lt;code&gt; -I&lt;/code&gt; 选项把目录前置在该列表前。&lt;/p&gt;
&lt;p&gt;这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 file 的文件。在编译源代码时，您可以通过&lt;code&gt; -I&lt;/code&gt; 选项把目录前置在该列表前。&lt;/p&gt;
&lt;h2&gt;1、#ifndef和#pragma once两者的使用方式有何区别？&lt;/h2&gt;
&lt;p&gt;示例代码如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方式一：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#ifndef __SOMEFILE_H__
#define  __SOMEFILE_H__
 ... ... // 声明、定义语句
#endif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方式二：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma once
 ... ... // 声明、定义语句
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;两者各有何特点？&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;（1）&lt;code&gt;#ifndef&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#ifndef&lt;/code&gt;的方式受C/C++语言标准支持。它不仅可以保证同一个文件不会被包含多次，也能保证内容完全相同的两个文件（或者代码片段）不会被不小心同时包含。&lt;/p&gt;
&lt;p&gt;当然，&lt;strong&gt;缺点就是如果不同头文件中的宏名不小心“撞车”，可能就会导致你看到头文件明明存在，但编译器却硬说找不到声明的状况——这种情况有时非常让人郁闷。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于编译器每次都需要打开头文件才能判定是否有重复定义，因此在编译大型项目时，&lt;code&gt;ifndef&lt;/code&gt;会使得编译时间相对较长，因此一些编译器逐渐开始支持&lt;code&gt;#pragma once&lt;/code&gt;的方式。&lt;/p&gt;
&lt;p&gt;（2）&lt;code&gt;#pragma once&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#pragma once&lt;/code&gt; 一般由编译器提供保证：同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件，而不是指内容相同的两个文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你无法对一个头文件中的一段代码作&lt;code&gt;pragma once&lt;/code&gt;声明，而只能针对文件。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其好处是，你不必再担心宏名冲突了，当然也就不会出现宏名冲突引发的奇怪问题。大型项目的编译速度也因此提高了一些。&lt;/p&gt;
&lt;p&gt;对应的缺点就是如果某个头文件有多份拷贝，本方法不能保证他们不被重复包含。当然，相比宏名冲突引发的“找不到声明”的问题，这种重复包含很容易被发现并修正。&lt;/p&gt;
&lt;p&gt;另外，这种方式不支持跨平台！&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;两者之间有什么联系？&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt; #pragma once&lt;/code&gt; 方式产生于&lt;code&gt;#ifndef&lt;/code&gt;之后，因此很多人可能甚至没有听说过。目前看来&lt;code&gt;#ifndef&lt;/code&gt;更受到推崇。因为&lt;code&gt;#ifndef&lt;/code&gt;受C/C++语言标准的支持，不受编译器的任何限制；&lt;/p&gt;
&lt;p&gt;而&lt;code&gt;#pragma once&lt;/code&gt;方式却不受一些较老版本的编译器支持，一些支持了的编译器又打算去掉它，所以它的兼容性可能不够好。&lt;/p&gt;
&lt;p&gt;一般而言，当程序员听到这样的话，都会选择&lt;code&gt;#ifndef&lt;/code&gt;方式，为了努力使得自己的代码“存活”时间更久，通常宁愿降低一些编译性能，这是程序员的个性，当然这是题外话啦。&lt;/p&gt;
&lt;p&gt;还看到一种用法是把两者放在一起的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; #pragma once
  #ifndef __SOMEFILE_H__
  #define __SOMEFILE_H__
  ... ... // 声明、定义语句
  #endif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结：&lt;/p&gt;
&lt;p&gt;​    看起来似乎是想兼有两者的优点。不过只要使用了&lt;code&gt;#ifndef&lt;/code&gt;就会有宏名冲突的危险，也无法避免不支持#pragma once的编译器报错，所以混用两种方法似乎不能带来更多的好处，倒是会让一些不熟悉的人感到困惑。&lt;/p&gt;
&lt;p&gt;​    选择哪种方式，应该在了解两种方式的情况下，视具体情况而定。只要有一个合理的约定来避开缺点，我认为哪种方式都是可以接受的。而这个已经不是标准或者编译器的责任了，应当由程序员自己或者小范围内的开发规范来搞定。&lt;/p&gt;
&lt;p&gt;为了避免同一个文件被&lt;code&gt;include&lt;/code&gt;多次&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1  #ifndef方式
2  #pragma once方式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;#ifndef&lt;/code&gt;的方式依赖于宏名字不能冲突，这不光可以保证同一个文件不会被包含多次，也能保证内容完全相同的两个文件不会被不小心同时包含。当然，缺点就是如果不同头文件的宏名不小心“撞车”，可能就会导致头文件明明存在，编译器却硬说找不到声明的状况&lt;/p&gt;
&lt;p&gt;`#pragma once`则由编译器提供保证：同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件，而不是指内容相同的两个文件。带来的好处是，你不必再费劲想个宏名了，当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝，本方法不能保证他们不被重复包含。当然，相比宏名碰撞引发的“找不到声明”的问题，重复包含更容易被发现并修正。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方式一由语言支持所以移植性好，方式二 可以避免名字冲突&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;2、 为什么 stdio.h 不会被重定义&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#include&lt;/code&gt;原则上只能包含头文件，不能包含cpp文件，否则可能出现重复定义的问题。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stdio.h&lt;/code&gt;等标准库头文件中&lt;strong&gt;已经含有防止重复包含的预编译指令&lt;/strong&gt;，多次包含这些文件也不会出现任何问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://www.cnblogs.com/zhjblogs/p/14166866.html&quot;&gt;https://www.cnblogs.com/zhjblogs/p/14166866.html&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Conda 和 pip 换源</title><link>https://tuoyuangui.github.io/website/posts/typora/python/conda-pip-%E6%8D%A2%E6%BA%90/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/python/conda-pip-%E6%8D%A2%E6%BA%90/</guid><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Conda 和 pip 换源&lt;/h1&gt;
&lt;h2&gt;conda&lt;/h2&gt;
&lt;p&gt;中科大源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
conda config --set show_channel_urls yes
conda config --remove-key channels        # 换回默认源

conda env remove --name your_env_name   # 删除环境
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PIP&lt;/h2&gt;
&lt;p&gt;下载某一个文件的时候，临时使用中科大源，加上如下后缀就行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install xx -i https://pypi.mirrors.ustc.edu.cn/simple/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;永久&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install pip -U

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在Jupyter笔记本中直接运行C语言代码并不直接支持，因为Jupyter是为Python、Julia、R和其他支持Jupyter内核的语言设计的。但是，你可以通过一些方法间接地在Jupyter笔记本中运行C语言代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#delete the env
conda remove -n lglc --all -y

# create the envirment for c
conda create -n lglc python==3.11
conda activate lglc

# change the conda source
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
conda config --set show_channel_urls yes

# change the pip source

pip install pip -U

pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple

# insall jupyter notebook

pip install numpy matplotlib jupyter
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用&lt;code&gt;!&lt;/code&gt;前缀运行C代码&lt;/h3&gt;
&lt;p&gt;你可以使用Jupyter的shell命令功能来编译和运行C代码。这需要你已经在系统上安装了C编译器（如GCC）。&lt;/p&gt;
&lt;p&gt;以下是如何在Jupyter笔记本中使用&lt;code&gt;!&lt;/code&gt;前缀来编译和运行C代码的步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先，编写C代码并保存到文件中。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// hello.c
#include &amp;lt;stdio.h&amp;gt;

int main() {
    printf(&quot;Hello, World!\n&quot;);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用&lt;code&gt;!&lt;/code&gt;前缀运行命令来编译C代码。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;!gcc hello.c -o hello
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用&lt;code&gt;!&lt;/code&gt;前缀运行编译后的程序。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;!./hello
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用&lt;code&gt;%%script&lt;/code&gt;魔法命令&lt;/h3&gt;
&lt;p&gt;Jupyter还提供了&lt;code&gt;%%script&lt;/code&gt;魔法命令，允许你在笔记本中运行脚本。这同样需要系统上安装了C编译器。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%%script bash
gcc hello.c -o hello &amp;amp;&amp;amp; ./hello
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用&lt;code&gt;%%writefile&lt;/code&gt;魔法命令&lt;/h3&gt;
&lt;p&gt;你可以使用&lt;code&gt;%%writefile&lt;/code&gt;魔法命令将代码块写入文件，然后编译和运行它。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%%writefile hello.c
#include &amp;lt;stdio.h&amp;gt;

int main() {
    printf(&quot;Hello, World!\n&quot;);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着编译并运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;!gcc hello.c -o hello
!./hello
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用ctypes或cffi库&lt;/h3&gt;
&lt;p&gt;如果你想在Python代码中调用C函数，你可以使用&lt;code&gt;ctypes&lt;/code&gt;或&lt;code&gt;cffi&lt;/code&gt;库。这需要你创建一个C库，然后从Python中加载它。&lt;/p&gt;
&lt;p&gt;这是一个使用&lt;code&gt;ctypes&lt;/code&gt;的简单例子：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编写C代码并编译为共享库。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// mylib.c
#include &amp;lt;stdio.h&amp;gt;

void say_hello() {
    printf(&quot;Hello from C!\n&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译为共享库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;!gcc -shared -o mylib.so -fPIC mylib.c
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用&lt;code&gt;ctypes&lt;/code&gt;加载并调用C函数。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;from ctypes import cdll

# 加载共享库
mylib = cdll.LoadLibrary(&apos;./mylib.so&apos;)

# 调用C函数
mylib.say_hello()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上方法可以帮助你在Jupyter笔记本中运行C语言代码或调用C函数。记住，这些方法需要在你的系统上安装C编译器，并且它们不会在Jupyter笔记本内部执行C代码，而是通过外部命令或库调用。&lt;/p&gt;
</content:encoded></item><item><title>中文字体</title><link>https://tuoyuangui.github.io/website/posts/typora/python/%E4%B8%AD%E6%96%87%E5%AD%97%E4%BD%93/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/python/%E4%B8%AD%E6%96%87%E5%AD%97%E4%BD%93/</guid><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;如果本来就没有中文字体，必须先安装并配置字体，保证有中文字体ttf的文件&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;配置：修改****matplotlibrc配置字体&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;1. 首先定位matplotlib的字体库路径（我使用python进行定位）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import matplotlib
matplotlib.matplotlib_fname()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2. 将中文字体文件**.ttf，拷贝到该目录的fonts/ttf下&lt;/p&gt;
&lt;p&gt;3. 删除 matplotlib 缓存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/.cache/matplotlib
rm * -r
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4. 修改matplotlibrc文件：修改font.sans-serif 加入中文字体&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;font.sans-serif     : Microsoft YaHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif, ***(刚加的字体名字)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5. 重启程序或在 jupyter中restart the kernel&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;应用一：用plt.rcParams设置&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import matplotlib.pyplot as plt
plt.rcParams[&apos;font.sans-serif&apos;]=[&apos;Microsoft YaHei&apos;]
plt.xlabel(&apos;测试&apos;)
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;应用二：用FontProperties，并指定字体文件&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt
font = FontProperties(fname=&apos;/mnt/share/code/font/SimHei.ttf&apos;, size=20)
plt.title(&apos;测试&apos;, fontproperties=font)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参考&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ask.hellobi.com/blog/safa/36673&quot;&gt;https://ask.hellobi.com/blog/safa/36673&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Lapack 数学库动态静态库安装</title><link>https://tuoyuangui.github.io/website/posts/typora/%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/lapack/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/lapack/</guid><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Lapack 数学库动态静态库安装&lt;/h1&gt;
&lt;p&gt;​	&lt;strong&gt;LAPACK（Linear Algebra PACKage）库&lt;/strong&gt;，是用Fortran语言编写的线性代数计算库，包含线性方程组求解（AX=b）、矩阵分解、矩阵求逆、求矩阵特征值、奇异值等。该库用BLAS库做底层运算，许多高层的数学库都用BLAS和LAPACK做底层。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; **BLAS（Basic Linear Algebra Subprograms）库**，是用Fortran语言实现的向量和矩阵运算库,是许多数值计算软件库的核心, 但也有一些其它的包装, 如cblas是C语言, 也有C++的包装, boost/ublas 是C++ template class的实现； 另外还有一些特别的实现, 如intel MKL, AMD core math library blas就是做向量、矩阵的基本运算，如加、减、乘等操作。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​		下载地址：https://netlib.org/lapack/&lt;/p&gt;
&lt;p&gt;​		安装前提：有Cmake， GUN complier， python&lt;/p&gt;
&lt;h2&gt;1、编译&lt;/h2&gt;
&lt;h3&gt;1.1 安装动态Lapack库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# dy-lib
$ tar -xvzf lapack-*.tar.gz
$ cd lapack-*
$ mkdir build &amp;amp;&amp;amp; cd build
$ cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=ON -DCBLAS=ON   # 编译lapack 和 cblas
$ make -j 20   # 采用20个线程编译
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.2 安装静态Lapack库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt; # static-lib
 $ cd lapack-*
 $ cp make.inc.example make.inc    # 设置头文件
 $ make -j20 blaslib
 $ make -j20 cblaslib
 $ make -j20 lapacklib
 $ make -j20 lapackelib
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、设置库和头文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt; # static-lib and dy-lib
 $ cd lapack-*
 # lib
 $ cp -r build/lib/ ./lib
 $ cp *.a ./lib
 # include
 $ cp CBLAS/incude/* ./include
 $ cp LAPACKE/incude/* ./include
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、配置环境变量&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./Lapack.assets/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.png&quot; alt=&quot;环境&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Bash Shell 实现程序并行</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/bash-shell-%E5%AE%9E%E7%8E%B0%E7%A8%8B%E5%BA%8F%E5%B9%B6%E8%A1%8C/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/bash-shell-%E5%AE%9E%E7%8E%B0%E7%A8%8B%E5%BA%8F%E5%B9%B6%E8%A1%8C/</guid><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Bash Shell 实现程序并行&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;(2023.03.21)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1. &lt;a href=&quot;https://www.w3cschool.cn/bashshell/bashshell-cyzi37i8.html&quot;&gt;Bash 简介_w3cschool&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Bash shell 可以在文本中直接运行Liunx 命令。
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Bash 是 Bourne Shell 程序“sh”的升级版本，这是一个开源 GNU 项目。它提供了比 Bourne Shell 更好的功能，适用于编程和交互使用。 我们可以这么理解，Bash 是一个命令处理器，通常运行于文本窗口中，可以将用户输入的命令解释并执行相应的操作，这样式的文件被称作脚本。 Bash 是绝大多数 Linux 、MAC 及 OS 默认的 shell 程序，并且 Shell Script 都大致相同。当您学会一种 Shell 后，其它的 Shell 都能够很快上手，而且一种 Shell Script 通常可以在很多 Shell 上使用，因此您不必在学习哪种 Shell 的选择上耗费太多的时间。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2. Bash 示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# Part 1 注释
# 单行注释

&amp;lt;&amp;lt; BLOCK
1.
2.多行注释（1）
3.
BLOCK

:&apos;
1.
2.多行注释（2）
3.&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 并行Bash&lt;/h3&gt;
&lt;p&gt;shell中的命令都是串行执行的，如果想要充分利用服务器的资源，需要一些小技巧&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# do the Jobs
ii=$(((nshots+1)/$Worker))
jj=$(((nshots+1)%$Worker))
for((i=0;i&amp;lt;$ii;i++))
do
    for((j=0;j&amp;lt;$Worker;j++))
    do
    {
        job=$((i*$Worker+j))
        bash ./jobs/lgl_$job.sh
    } &amp;amp;     # 并行$Worker个程序
    done
    wait   # 等待完成 多个
done
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 参考&lt;/h3&gt;
&lt;p&gt;1 &lt;a href=&quot;https://www.w3cschool.cn/bashshell/bashshell-4cv637th.html&quot;&gt;Bash 教程总览_w3cschool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2 &lt;a href=&quot;https://cloud.tencent.com/developer/article/1863195&quot;&gt;Shell-使用&amp;amp;和wait让你的脚本并行执行 - 腾讯云开发者社区-腾讯云 (tencent.com)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Ubuntu中一般的软件安装</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/%E4%B8%80%E8%88%AC%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85%E5%92%8C%E5%AE%89%E8%A3%85/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/%E4%B8%80%E8%88%AC%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85%E5%92%8C%E5%AE%89%E8%A3%85/</guid><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Ubuntu中一般的软件安装&lt;/h1&gt;
&lt;h2&gt;一、查看已安装软件&lt;/h2&gt;
&lt;p&gt;​	用 apt 命令显示已安装软件包：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt list –installed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	用 dpkg 命令显示已安装软件包:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dpkg-query -l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	列出系统里 Snap 已安装软件包:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;snap list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	列出系统里 Flatpak 已安装软件包:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flatpak list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	展示安装位置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo  apt-get install aptitude

sudo aptitude show zip
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;二、Ubuntu中软件安装方法&lt;/h2&gt;
&lt;p&gt;​	&lt;strong&gt;1、APT方式&lt;/strong&gt;
​	（1）普通安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install softname1 softname2 …;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	（2）修复安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get -f install softname1 softname2... ;(-f Atemp to correct broken dependencies)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	（3）重新安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get --reinstall install softname1 softname2...;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	&lt;strong&gt;2、Dpkg方式&lt;/strong&gt;
​	（1）普通安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dpkg -i package_name.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	&lt;strong&gt;3、源码安装（.tar、tar.gz、tar.bz2、tar.Z）&lt;/strong&gt;
​	首先解压缩源码压缩包然后通过tar命令来完成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    a．解xx.tar.gz：tar zxf xx.tar.gz
    b．解xx.tar.Z：tar zxf xx.tar.Z
    c．解xx.tgz：tar zxf xx.tgz
    d．解xx.bz2：bunzip2 xx.bz2
    e．解xx.tar：tar xf xx.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	然后进入到解压出的目录中，建议先读一下README之类的说明文件，因为此时不同源代码包或者预编译包可能存在差异，
​	然后建议使用ls -F --color或者ls -F命令（实际上我的只需要 l 命令即可）查看一下可执行文件，可执行文件会以*号的尾部标志。
​	一般依次执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./configure
 make
 sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	即可完成安装。&lt;/p&gt;
&lt;h2&gt;三、Ubuntu中软件包的卸载方法&lt;/h2&gt;
&lt;p&gt;​	&lt;strong&gt;1、APT方式&lt;/strong&gt;
​	（1）移除式卸载：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get remove softname1 softname2 …;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;（移除软件包，当包尾部有+时，意为安装）
（2）清除式卸载 ：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get --purge remove softname1 softname2...;(同时清除配置)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	        清除式卸载：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get purge sofname1 softname2...;(同上，也清除配置文件)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	&lt;strong&gt;2、Dpkg方式&lt;/strong&gt;
​	（1）移除式卸载：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dpkg -r pkg1 pkg2 ...;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	（2）清除式卸载：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dpkg -P pkg1 pkg2...;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;四、其他&lt;/h2&gt;
&lt;p&gt;​	可以使用以下命令清理系统垃圾&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get autoclean
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	清理旧版本的软件缓存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get clean
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​	清理所有软件缓存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get autoremove
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】 https://zhuanlan.zhihu.com/p/57472336&lt;/p&gt;
&lt;p&gt;【2】https://blog.csdn.net/jasonzhoujx/article/details/80384029&lt;/p&gt;
&lt;p&gt;【3】https://blog.csdn.net/qq_40150691/article/details/83026169&lt;/p&gt;
</content:encoded></item><item><title>malloc与realloc的区别</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/malloc%E5%92%8Crealloc%E7%9A%84%E5%8C%BA%E5%88%AB/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/malloc%E5%92%8Crealloc%E7%9A%84%E5%8C%BA%E5%88%AB/</guid><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;malloc与realloc的区别&lt;/h2&gt;
&lt;p&gt;ANSI C说明了三个用于存储空间动态分配的函数
(1) &lt;code&gt;malloc&lt;/code&gt; 分配指定字节数的存储区。此存储区中的初始值不确定
(2) &lt;code&gt;calloc&lt;/code&gt; 为指定长度的对象，分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0
(3) &lt;code&gt;realloc&lt;/code&gt;更改以前分配区的长度(增加或减少)。当增加长度时，可能需将以前分配区的内容移到另一个足够大的区域，而新增区域内的初始值则不确定。
分配函数时再分配 &lt;code&gt;realloc() &lt;/code&gt;，使我们可以增、减以前分配区的长度(最常见的用法是增加该区)。如果先分配一个可容纳长度为512的数组的空间，并在运行时填充它，但又发现空间不够，则可调用&lt;code&gt;realloc&lt;/code&gt;扩充该存储空间。如果在该存储区后有足够的空间可供扩充，则可在原存储区位置上向高地址方向扩充，并返回传送给它的同样的指针值。如果在&lt;strong&gt;原存储区后没有足够的空间&lt;/strong&gt;，则&lt;strong&gt;realloc分配另一个足够大的存储区&lt;/strong&gt;，&lt;strong&gt;将现存的512个元素数组的内容复制到新分配的存储区&lt;/strong&gt;。因为这种存储区可能会移动位置，所以不应当使用任何指针指在该区中。注意，&lt;code&gt;realloc&lt;/code&gt;的最后一个参数是存储区的newsize(新长度)，不是新、旧长度之差。作为一个特例，若ptr是一个空指针，则&lt;code&gt;realloc&lt;/code&gt;的功能与&lt;code&gt;malloc&lt;/code&gt;相同，用于分配一个指定长度newsize的存储区。&lt;/p&gt;
&lt;h4&gt;一.malloc&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;malloc的参数就是所需分配的字节数&lt;/strong&gt;，malloc在c语言中不是关键字而是C函数库中提供的函数。调用malloc时就是在内存池中提取一块连续的空间，并返回这块内存的指针。代码示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
typedef struct node{
    int data;
    struct node *next;
}node;

node *create(int n)
{
    node *p = NULL, *head;
    head = (node*)malloc(sizeof (node ));
    p = head;	node *s;
    int i = 1;
    if( 0 != n )
    {
        while( i &amp;lt;= n )
        {
            s = (node *)malloc(sizeof (node));
            s-&amp;gt;data = i++;    // 为循环链表初始化，第一个结点为1，第二个结点为2。
            p-&amp;gt;next = s;
            p = s;
        }
        s-&amp;gt;next = head-&amp;gt;next;
    }
    free(head);
    return s-&amp;gt;next ;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;二.realloc&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;void realloc(void *ptr,size_t new_size)&lt;/code&gt;; ptr是指向原来地址的指针，这个函数用于修改一个原先已经分配内存块的大小。&lt;/p&gt;
&lt;p&gt;使用：&lt;/p&gt;
&lt;p&gt;1.可以使一块内存扩大或缩小（原来的内存块可以扩大缩小）&lt;/p&gt;
&lt;p&gt;（1.）如果是扩大一个内存块，则将原来的内存块保留在他的后边新增一块内存块（但是新增的内存块并未初始化）&lt;/p&gt;
&lt;p&gt;（2.）如果是缩小一块内存块，则将该内存块的后半部分直接拿掉，剩余部分内存块及其内容保留。&lt;/p&gt;
&lt;p&gt;2.原来的内存块无法扩大缩小&lt;/p&gt;
&lt;p&gt;如果是着这种情况，realloc会重新开辟一个新的内存空间，并把原来的内存空间的内容拷贝到新的内存空间里。&lt;/p&gt;
&lt;p&gt;注意：再调用完realloc后就不能使用指向就内存的指针，而是用返回的新的指针。&lt;/p&gt;
&lt;p&gt;内存扩展如图所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./malloc%E5%92%8Crealloc%E7%9A%84%E5%8C%BA%E5%88%AB.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tha2FoYW9tYQ==,size_16,color_FFFFFF,t_70.png&quot; alt=&quot;Image 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;值得一提的是：&lt;strong&gt;如果realloc中的第一个参数如果为空则和malloc一样&lt;/strong&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;Windows.h&amp;gt;
#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;malloc.h&amp;gt;
#include&amp;lt;stdlib.h&amp;gt;
int main()
{
    const int size = 2000;
    int *p = (int *)malloc(20 * sizeof(int));
    int *p1 = (int *)realloc(p, size*sizeof(int));
    printf(&quot;%x\n&quot;, p);
    printf(&quot;%x\n&quot;, p1);
    system(&quot;pause&quot;);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./malloc%E5%92%8Crealloc%E7%9A%84%E5%8C%BA%E5%88%AB.assets/20190222120011520.png&quot; alt=&quot;Image 4&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://blog.csdn.net/u010137839/article/details/78643503&quot;&gt;https://blog.csdn.net/u010137839/article/details/78643503&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>podman 创建镜像</title><link>https://tuoyuangui.github.io/website/posts/typora/docker%E5%92%8Cpodman/podman%E5%88%9B%E5%BB%BA%E9%95%9C%E5%83%8F/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/docker%E5%92%8Cpodman/podman%E5%88%9B%E5%BB%BA%E9%95%9C%E5%83%8F/</guid><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;podman 创建镜像&lt;/h1&gt;
&lt;h2&gt;一、dockerfile 语法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;FROM&lt;/code&gt;：指定基础镜像。构建过程从此镜像开始。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;FROM ubuntu:18.04
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使用Ubuntu 18.04版本的镜像作为构建过程的基础。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;LABEL&lt;/code&gt;：添加元数据到镜像，这些元数据可以包含作者、版本等信息。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;LABEL maintainer=&quot;John Doe &amp;lt;john.doe@example.com&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将添加一个标签，其中包含维护者的信息。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;RUN&lt;/code&gt;：在构建过程中执行命令。这些命令会在镜像的上下文中执行，并创建新的镜像层。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \
    build-essential \
    wget \
    python3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使用&lt;code&gt;apt-get update&lt;/code&gt;和&lt;code&gt;apt-get install&lt;/code&gt;命令安装一些软件包。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;CMD&lt;/code&gt;：指定容器启动时默认执行的命令。这些命令会被加入到容器启动时的命令中。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;CMD [&quot;python3&quot;, &quot;./app.py&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使容器在启动时执行&lt;code&gt;python3 ./app.py&lt;/code&gt;命令。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ENTRYPOINT&lt;/code&gt;：指定容器启动时执行的命令。这些命令会替换掉用户指定的命令。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ENTRYPOINT [&quot;python3&quot;, &quot;./app.py&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使容器在启动时执行&lt;code&gt;python3 ./app.py&lt;/code&gt;命令，即使用户指定其他命令，这个命令也会被替换掉。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;EXPOSE&lt;/code&gt;：声明容器监听的端口。这些端口会在启动容器时自动映射到宿主机的端口。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;EXPOSE 8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使容器在启动时监听端口8080。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;VOLUME&lt;/code&gt;：指定容器内的目录作为卷，用于持久化数据。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;VOLUME [&quot;/data&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使容器内的&lt;code&gt;/data&lt;/code&gt;目录作为卷，用于持久化数据。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ENV&lt;/code&gt;：设置环境变量。这些环境变量可以在构建过程中使用，也可以在容器运行时使用。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ENV NAME World
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将设置一个名为&lt;code&gt;NAME&lt;/code&gt;的环境变量，其值为&lt;code&gt;World&lt;/code&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;USER&lt;/code&gt;：指定构建过程中使用的用户。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;USER root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使用&lt;code&gt;root&lt;/code&gt;用户进行构建。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;WORKDIR&lt;/code&gt;：指定构建过程中的工作目录。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; WORKDIR /app
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;这将设置工作目录为`/app`。
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;COPY&lt;/code&gt;：将文件或目录从宿主机复制到镜像中。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; COPY . /app
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;这将复制当前目录下的所有内容到镜像中的`/app`目录。
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ADD&lt;/code&gt;：与&lt;code&gt;COPY&lt;/code&gt;类似，但它可以自动解压压缩文件。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; ADD ./path/to/source.tar.gz /app/path/to/destination/
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;这将自动解压`./path/to/source.tar.gz`文件到`/app/path/to/destination/`目录。
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ONBUILD&lt;/code&gt;：指定当构建一个以当前镜像为基础的镜像时应该执行的命令。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; ONBUILD ADD . /app
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;这将添加当前目录下的所有内容到以当前镜像为基础的镜像中的`/app`目录。
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;STOPSIGNAL&lt;/code&gt;：指定在容器停止时发送的信号。例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; STOPSIGNAL S
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下是一个简单的Dockerfile示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM ubuntu:18.04

RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \
 build-essential \
 wget \
 python3

WORKDIR /app

COPY . /app

RUN pip3 install -r requirements.txt

CMD [&quot;python3&quot;, &quot;./app.py&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个Dockerfile构建了一个基于Ubuntu 18.04的基础镜像，安装了构建必需的软件包，复制了应用程序代码，并安装了Python依赖。最后，它指定了容器启动时应该执行的命令。&lt;/p&gt;
&lt;h2&gt;二、podman的语法&lt;/h2&gt;
&lt;p&gt;Podman 是一个开源的容器引擎，用于构建、运行和连接容器。以下是一些基础的 Podman 命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;`podman system migrate`   # repair the podman
`sudo systemctl restart podman`
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;构建镜像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman build -t myimage .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使用当前目录中的 Dockerfile 构建一个名为 &lt;code&gt;myimage&lt;/code&gt; 的镜像。&lt;/p&gt;
&lt;h3&gt;运行容器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman run -it --rm myimage /bin/bash    --name xx

podman run --name lglsoft -it --rm --env=DISPLAY=180.201.179.79:0.0 susoft:latest  /bin/bash

podman run -it --device=/dev/dri:/dev/dri --volume=/tmp/.X11-unix:/tmp/.X11-unix:rw --volume=/etc/localtime:/etc/localtime:ro --env=DISPLAY=$DISPLAY dockerfile-su /bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将使用名为 &lt;code&gt;myimage&lt;/code&gt; 的镜像创建并运行一个交互式的容器。&lt;/p&gt;
&lt;h3&gt;列出容器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将列出当前正在运行的容器。&lt;/p&gt;
&lt;h3&gt;列出镜像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman images
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将列出所有可用的镜像。&lt;/p&gt;
&lt;h3&gt;删除容器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman rm mycontainer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将删除名为 &lt;code&gt;mycontainer&lt;/code&gt; 的容器。&lt;/p&gt;
&lt;h3&gt;删除镜像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman rmi myimage
podman rmi &amp;lt;image_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将删除名为 &lt;code&gt;myimage&lt;/code&gt; 的镜像。&lt;/p&gt;
&lt;h3&gt;列出网络&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman network list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将列出所有已创建的网络。&lt;/p&gt;
&lt;h3&gt;删除网络&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman network rm mynetwork
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将删除名为 &lt;code&gt;mynetwork&lt;/code&gt; 的网络。&lt;/p&gt;
&lt;h3&gt;导出容器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman export mycontainer &amp;gt; mycontainer.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将导出名为 &lt;code&gt;mycontainer&lt;/code&gt; 的容器为 tar 文件。&lt;/p&gt;
&lt;h3&gt;导入镜像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman import myimage.tar myimage
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将导入名为 &lt;code&gt;myimage.tar&lt;/code&gt; 的 tar 文件为镜像。&lt;/p&gt;
&lt;h3&gt;导出镜像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman save myimage &amp;gt; myimage.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将导出名为 &lt;code&gt;myimage&lt;/code&gt; 的镜像为 tar 文件。&lt;/p&gt;
&lt;h3&gt;导入容器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;podman import mycontainer.tar mycontainer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将导入名为 &lt;code&gt;mycontainer.tar&lt;/code&gt; 的 tar 文件为容器。&lt;/p&gt;
&lt;p&gt;这些是一些基础的 Podman 命令，根据您的具体需求，可能还需要使用其他命令。Podman 的命令行选项和功能可能会随着版本更新而变化，因此建议查阅最新的 Podman 文档以获取最准确的信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#########################################################################
# This Dockerfile builds a base image to run Seismic UNIX  on generic CPU
# architectures using GCC compilers and OpenMPI.
# WRITER: Guolong Li (1712343961@qq.com)
# TIME: 06.18.2024
#########################################################################

# Base image
FROM ubuntu:22.04 as base

# Verb=NO
ENV DEBIAN_FRONTEND noninteractive
LABEL maintainer=&quot;Guolong Li &amp;lt;1712343961@qq.com&amp;gt;&quot;

# change the aliyun source to download software
RUN sed -i &apos;s/archive.ubuntu.com/mirrors.aliyun.com/g&apos; /etc/apt/sources.list
CMD [&quot;/bin/bash&quot;]
EXPOSE 8888

# cp Seismic Unix (unziped 44R28 and well configured)
RUN mkdir -p /Software/Seismic_Unix
ADD ./seismic_unix.tar.gz /Software/Seismic_Unix/
ENV CWPROOT=/Software/Seismic_Unix
ENV PATH=$PATH:/Software/Seismic_Unix/bin

# Install basic package
RUN apt-get update &amp;amp;&amp;amp; \
 apt-get install -y build-essential mpich\
 git xorg gcc libx11-dev libxt-dev libxext-dev make libmotif-dev libtirpc-dev gfortran libglu1-mesa-dev freeglut3-dev \
 libxmu-dev libxmu-headers libxi-dev  libglu1-mesa-dev freeglut3-dev libxmu-dev libxmu-headers libxi-dev

# set the Basic var
ARG nproc=&quot;10&quot;

# Install Seismic Unix (only support one thread)
RUN cd /Software/Seismic_Unix/src/ &amp;amp;&amp;amp; ls &amp;amp;&amp;amp;    make install
RUN cd /Software/Seismic_Unix/src/ &amp;amp;&amp;amp;    make xtinstall
RUN cd /Software/Seismic_Unix/src/ &amp;amp;&amp;amp;    make finstall

# Install Miniconda
RUN mkdir -p /Software/Miniconda



# # Instal the OpenMPI
# ARG OMPI_BRANCH=&quot;v4.1.4&quot;
# RUN mkdir -p /deps &amp;amp;&amp;amp; mkdir -p /opt/openmpi &amp;amp;&amp;amp; cd /deps &amp;amp;&amp;amp; \
#     git clone --depth 1 --recursive --branch ${OMPI_BRANCH} https://github.com/open-mpi/ompi.git openmpi &amp;amp;&amp;amp; \
#     cd openmpi &amp;amp;&amp;amp; ./autogen.pl &amp;amp;&amp;amp; \
#     mkdir build &amp;amp;&amp;amp;  cd build &amp;amp;&amp;amp; \
#     ../configure --prefix=/opt/openmpi/ \
#                  --enable-mca-no-build=btl-uct --enable-mpi1-compatibility &amp;amp;&amp;amp; \
#     make -j ${nproc} &amp;amp;&amp;amp; \
#     make install &amp;amp;&amp;amp; \
#     rm -rf /deps/openmpi

# # Set OpenMPI path
# ENV PATH=${PATH}:/opt/openmpi/bin
# ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/openmpi/lib
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>GCC的编译过程</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/gcc%E7%9A%84%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/gcc%E7%9A%84%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B/</guid><pubDate>Fri, 12 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;GCC的编译过程&lt;/h1&gt;
&lt;h2&gt;1、gcc的编译步骤&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;gcc编译：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;4步骤： 预处理、编译、汇编、连接。&lt;/p&gt;
&lt;p&gt;-I：    指定头文件所在目录位置。&lt;/p&gt;
&lt;p&gt;-c：    只做预处理、编译、汇编。得到 二进制 文件！！！&lt;/p&gt;
&lt;p&gt;-g：    编译时添加调试语句。 主要支持 gdb 调试。&lt;/p&gt;
&lt;p&gt;-Wall： 显示所有警告信息。&lt;/p&gt;
&lt;p&gt;-D：    向程序中“动态”注册宏定义。  #define NAME VALUE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./gcc%E7%9A%84%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B.assets/clip_image001.png&quot; alt=&quot;gcc编译&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./gcc%E7%9A%84%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B.assets/clip_image002.png&quot; alt=&quot;计算机生成了可选文字: 编译： 4步到： 罨 -Wall: 预处理、编译、拒编、接。 指定头文件所在目录位置。 只做预处理、编译、汇编·得到二进制文件！！！ 编译时添加泅试语句·主要支持gdb调试。 显示所有告信息。 向程序中“动态”注册宏定义。&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gcc 与 g++ 分别是 gnu 的 c &amp;amp; c++ 编译器 gcc/g++ 在执行编译工作的时候，总共需要4步：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;1、预处理,生成 .i     的文件[预处理器cpp]&lt;/li&gt;
&lt;li&gt;2、将预处理后的文件转换成汇编语言,     生成文件 .s [编译器egcs]&lt;/li&gt;
&lt;li&gt;3、有汇编变为目标代码(机器代码)生成     .o 的文件[汇编器as]&lt;/li&gt;
&lt;li&gt;4、连接目标代码, 生成可执行程序     [链接器ld]&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2、gcc编译参数详解&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;只激活预处理,编译,和汇编,也就是他只把程序做成obj文件&lt;/p&gt;
&lt;p&gt;例子用法:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc -c hello.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;他将生成 .o 的 obj 文件&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-S&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;只激活预处理和编译，就是指把文件编译成为汇编代码。&lt;/p&gt;
&lt;p&gt;例子用法:&lt;/p&gt;
&lt;p&gt;gcc -S hello.c&lt;/p&gt;
&lt;p&gt;他将生成 .s 的汇编代码，你可以用文本编辑器察看。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-E&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;只激活预处理,这个不生成文件, 你需要把它重定向到一个输出文件里面。&lt;/p&gt;
&lt;p&gt;例子用法:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc -E hello.c &amp;gt; pianoapan.txt
gcc -E hello.c | more
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-o&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;制定目标名称, 默认的时候, gcc 编译出来的文件是 a.out, 很难听, 如果你和我有同感，改掉它, 哈哈。&lt;/p&gt;
&lt;p&gt;例子用法:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc -o hello.exe hello.c
gcc -o hello.asm -S hello.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-pipe&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用管道代替编译中临时文件, 在使用非 gnu 汇编工具的时候, 可能有些问题。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc -pipe -o hello.exe hello.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-ansi&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关闭 gnu c中与 ansi c 不兼容的特性, 激活 ansi c 的专有特性（包括禁止一些 asm inline typeof 关键字, 以及 UNIX,vax 等预处理宏）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-include file&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用 &lt;strong&gt;&lt;code&gt;#include&amp;lt;filename&amp;gt;&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;例子用法:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc hello.c -include /root/pianopan.h
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-Dmacro&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;相当于 C 语言中的 &lt;strong&gt;#define macro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-Dmacro=defn&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;相当于 C 语言中的 &lt;strong&gt;#define macro=defn&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-Umacro&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;相当于 C 语言中的 &lt;strong&gt;#undef macro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-undef&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;取消对任何非标准宏的定义&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-C&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在预处理的时候, 不删除注释信息, 一般和-E使用, 有时候分析程序，用这个很方便的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-M&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用 &lt;strong&gt;gcc -M hello.c&lt;/strong&gt; 来测试一下，很简单。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-g&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;只是编译器，在编译的时候，产生调试信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-static&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此选项将禁止使用动态库，所以，编译出来的东西，一般都很大，也不需要什么动态连接库，就可以运行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-share&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此选项将尽量使用动态库，所以生成文件比较小，但是需要系统由动态库。&lt;/p&gt;
&lt;p&gt;GCC 是 GNU 的 C 和 C++ 编译器。实际上，GCC 能够编译三种语言：C、C++ 和 Object C（C 语言的一种面向对象扩展）。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gcc 命令的常用选项&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;选项&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;解释&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-ansi&lt;/td&gt;
&lt;td&gt;只支持 ANSI 标准的 C  语法。这一选项将禁止 GNU C 的某些特色， 例如 asm 或 typeof 关键词。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-c&lt;/td&gt;
&lt;td&gt;只编译并生成目标文件。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-DMACRO&lt;/td&gt;
&lt;td&gt;以字符串&quot;1&quot;定义  MACRO 宏。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-DMACRO=DEFN&lt;/td&gt;
&lt;td&gt;以字符串&quot;DEFN&quot;定义  MACRO 宏。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-E&lt;/td&gt;
&lt;td&gt;只运行 C 预编译器。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-g&lt;/td&gt;
&lt;td&gt;生成调试信息。GNU 调试器可利用该信息。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-IDIRECTORY&lt;/td&gt;
&lt;td&gt;指定额外的头文件搜索路径DIRECTORY。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-LDIRECTORY&lt;/td&gt;
&lt;td&gt;指定额外的函数库搜索路径DIRECTORY。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-lLIBRARY&lt;/td&gt;
&lt;td&gt;连接时搜索指定的函数库LIBRARY。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-m486&lt;/td&gt;
&lt;td&gt;针对 486 进行代码优化。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-o FILE&lt;/td&gt;
&lt;td&gt;生成指定的输出文件。用在生成可执行文件时。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-O0&lt;/td&gt;
&lt;td&gt;不进行优化处理。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-O 或 -O1&lt;/td&gt;
&lt;td&gt;优化生成代码。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-O2&lt;/td&gt;
&lt;td&gt;进一步优化。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-O3&lt;/td&gt;
&lt;td&gt;比 -O2 更进一步优化，包括  inline 函数。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-shared&lt;/td&gt;
&lt;td&gt;生成共享目标文件。通常用在建立共享库时。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-static&lt;/td&gt;
&lt;td&gt;禁止使用共享连接。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-UMACRO&lt;/td&gt;
&lt;td&gt;取消对 MACRO 宏的定义。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-w&lt;/td&gt;
&lt;td&gt;不生成任何警告信息。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-Wall&lt;/td&gt;
&lt;td&gt;生成所有警告信息。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】https://www.runoob.com/w3cnote/gcc-parameter-detail.html&lt;/p&gt;
</content:encoded></item><item><title>OpenMP学习目录</title><link>https://tuoyuangui.github.io/website/posts/typora/%E6%8C%87%E5%8D%97/openmp%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E6%8C%87%E5%8D%97/openmp%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><pubDate>Fri, 12 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;OpenMP学习目录&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#openmp&quot;&gt;OpenMP&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BE%8B1%E5%90%91%E9%87%8F%E5%8A%A0%E6%B3%95&quot;&gt;例1、向量加法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BE%8B2%E5%90%91%E9%87%8F%E5%86%85%E7%A7%AF&quot;&gt;例2、向量内积&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#openmp%E6%8C%87%E4%BB%A4&quot;&gt;OpenMP指令&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#parallel%E6%8C%87%E4%BB%A4&quot;&gt;parallel指令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#for%E6%8C%87%E4%BB%A4&quot;&gt;for指令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sections%E6%8C%87%E4%BB%A4&quot;&gt;sections指令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#critical%E6%8C%87%E4%BB%A4&quot;&gt;critical指令&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#openmp%E5%AD%90%E5%8F%A5&quot;&gt;OpenMP子句&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#if%E5%AD%90%E5%8F%A5&quot;&gt;if子句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#num_threads%E5%AD%90%E5%8F%A5&quot;&gt;num_threads子句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#private%E5%AD%90%E5%8F%A5&quot;&gt;private子句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#reduction%E5%AD%90%E5%8F%A5&quot;&gt;reduction子句&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#openmp%E5%87%BD%E6%95%B0&quot;&gt;OpenMP函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%8F%82%E8%80%83&quot;&gt;参考&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a href=&quot;#openmp&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:openmp&quot;&gt;OpenMP&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;OpenMP (Open Multi-Processing)是一套支持跨平台共享内存方式的多线程并发的编程API，使用C,C++和Fortran语言，可以在大多数的处理器体系和操作系统中运行。OpenMP包括一套编译器指令、库和一些能够影响运行行为的环境变量。OpenMP采用#pragma omp来控制线程，即使用c/c++标准留给编译器厂商的实现定义行为控制语法来实现，因此OpenMP标准针对的是编译器厂商。要确定某个平台是否支持OpenMP，只需要看是否有支持OpenMP的编译器，如windows的visual studio编译器只支持OpenMP 2.0，而最新版的OpenMP标准为OpenMP5.0，因此windows平台对OpenMP的支持不太友好。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;#%E4%BE%8B1%E5%90%91%E9%87%8F%E5%8A%A0%E6%B3%95&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:%E4%BE%8B1%E5%90%91%E9%87%8F%E5%8A%A0%E6%B3%95&quot;&gt;例1、向量加法&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 文件：vector_add_omp.cpp
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;

int main() {
    const int n = 10;
    std::vector&amp;lt;int&amp;gt; v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector&amp;lt;int&amp;gt; v2 = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    std::vector&amp;lt;int&amp;gt; v3(n);

    #pragma omp parallel for
    for (int i = 0; i &amp;lt; n; ++i)
        v3[i] = v1[i] + v2[i];

    for (int i = 0; i &amp;lt; n; ++i)
        std::cout &amp;lt;&amp;lt; v3[i] &amp;lt;&amp;lt; &quot; &quot;;
    std::cout &amp;lt;&amp;lt; std::endl;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译：&lt;code&gt;g++ -fopenmp vector_add_omp.cpp -o vector_add_omp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./vector_add_omp
11 11 11 11 11 11 11 11 11 11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;OpenMP采用fork/join并行模式，程序开始时只有一个主线程，程序中的串行部分由主线程执行，并行部分派生其它线程共同执行，所有线程执行完毕后才会退出并行区域，因此在输出v3时可以确保已经计算完成。&lt;/p&gt;
&lt;p&gt;parallel for中循环小括号内的语句必须按照一定的规范书写才能并行：&lt;/p&gt;
&lt;p&gt;(1) 第一条语句是循环变量初始化的语句，必须写成&quot;变量=初值&quot;的形式。如i=0。&lt;/p&gt;
&lt;p&gt;(2) 第二条语句是循环限制语句，必须为这4种形式之一：&lt;code&gt;i &amp;lt; n、 i &amp;lt;= n、 i &amp;gt; n、 i&amp;gt;= n&lt;/code&gt;。需要注意循环中不能有影响循环次数的语句，如break语句或者改变循环变量的语句。&lt;/p&gt;
&lt;p&gt;(3) 第三条语句改变循环变量，必须写成这9种形式之一：&lt;code&gt;i++、++i、i--、--i、i += inc、i -= inc、i = i + inc、i = i - inc、i = inc + i&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;此外，还需要注意的是，程序中的变量有共享和线程私有之分，在parallel for中，凡是for循环中声明的变量都是线程私有的，每个线程都有一份，而for循环外声明的为所有线程共享的。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;#%E4%BE%8B2%E5%90%91%E9%87%8F%E5%86%85%E7%A7%AF&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:%E4%BE%8B2%E5%90%91%E9%87%8F%E5%86%85%E7%A7%AF&quot;&gt;例2、向量内积&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 文件：vector_dot_omp.cpp
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;

int main() {
    const int n = 10;
    std::vector&amp;lt;int&amp;gt; v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector&amp;lt;int&amp;gt; v2 = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};

    int sum = 0;

    #pragma omp parallel for reduction(+:sum)
    for (int i = 0; i &amp;lt; n; ++i)
        sum += v1[i] * v2[i];

    std::cout &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; std::endl;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译：&lt;code&gt;g++ -fopenmp vector_dot_omp.cpp -o vector_dot_omp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./vector_dot_omp
220
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;reduction对一个或多个变量指定一个操作符，每个线程将创建变量的一个私有拷贝，在区域结束处，用指定的操作符将私有拷贝的值进行归约，然后用归约的结果更新原来的变量。如vector_dot_omp.cpp中，每个线程中都有自己的局部变量sum，然后计算一部分和，最后将所有的部分和相加，更新共享的变量sum。&lt;/p&gt;
&lt;p&gt;reduction支持8种操作符，创建私有变量时使用的初始值依赖于操作符，如下表所示：&lt;/p&gt;
&lt;p&gt;| 操作符 | + | - | * | &amp;amp; | | | ^ | &amp;amp;&amp;amp; | || |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 初始值 | 0 | 0 | 1 | ~0 | 0 | 0 | 1 | 0 |&lt;/p&gt;
&lt;p&gt;显然，分段后的计算结果要与串行结果相同，使用的运算必须满足交换率和结合率，减法是不满足这两条性质的，而上表却出现了减法，这是因为此处的减法和加法的效果基本相同，使用场合为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma omp parallel for reduction(-:sum)
for (int i = 0; i &amp;lt; n; ++i)
    sum -= v1[i] * v2[i];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它和下面的代码计算结果实际上是相同的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma omp parallel for reduction(+:sum)
for (int i = 0; i &amp;lt; n; ++i)
    sum -= v1[i] * v2[i];
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a href=&quot;#openmp%E6%8C%87%E4%BB%A4&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:openmp%E6%8C%87%E4%BB%A4&quot;&gt;OpenMP指令&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在c/c++中，OpenMP的基本使用方法为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma omp directives [clause[[,] clause] ... ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;OpenMP的指令有：&lt;code&gt;parallel, for, sections, critical&lt;/code&gt;等。&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;#parallel%E6%8C%87%E4%BB%A4&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:parallel%E6%8C%87%E4%BB%A4&quot;&gt;parallel指令&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;parallel指令用于定义一个并行执行的代码块。如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;omp.h&amp;gt;

int main() {
    #pragma omp parallel
    {
        int i = omp_get_thread_num();

        // 连续cout不是线程安全的，只能使用printf
        // std::cout &amp;lt;&amp;lt; &quot;Hello from thread &quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot;\n&quot;;
        printf(&quot;Hello from thread %d\n&quot;, i);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hello from thread 6
Hello from thread 3
Hello from thread 4
Hello from thread 1
Hello from thread 0
Hello from thread 5
Hello from thread 7
Hello from thread 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;a href=&quot;#for%E6%8C%87%E4%BB%A4&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:for%E6%8C%87%E4%BB%A4&quot;&gt;for指令&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;for指令的语法为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma omp [parallel] for [clauses]
for_statement
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不加parallel，后面所跟的for循环只在某一个线程内运行，而如果出现在parallel声明的块内则相当于parallel for。如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;vector&amp;gt;

int main() {
    #pragma omp for
    for (int i = 0; i &amp;lt; 4; ++i)
        printf(&quot;%d &quot;, i);
    printf(&quot;\n&quot;);

    #pragma omp parallel
    {
        #pragma omp for
        for (int i = 0; i &amp;lt; 4; ++i)
            printf(&quot;%d &quot;, i);
    }
    printf(&quot;\n&quot;);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果为：&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;#sections%E6%8C%87%E4%BB%A4&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:sections%E6%8C%87%E4%BB%A4&quot;&gt;sections指令&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;sections指令用于指定分别在多个线程内执行的代码块，语法为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma omp [parallel] sections [clauses]
{
    #pragma omp section
    {
        code_block
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;omp.h&amp;gt;

int main() {
    #pragma omp parallel sections
    {
        #pragma omp section
        printf(&quot;section1, thread id is %d\n&quot;, omp_get_thread_num());

        #pragma omp section
        printf(&quot;section2, thread id is %d\n&quot;, omp_get_thread_num());

        #pragma omp section
        printf(&quot;section3, thread id is %d\n&quot;, omp_get_thread_num());

        #pragma omp section
        printf(&quot;section4, thread id is %d\n&quot;, omp_get_thread_num());
    }

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;section 3, thread id is 5
section 1, thread id is 6
section 2, thread id is 1
section 4, thread id is 7
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可见的确是在不同的线程中执行的。&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;#critical%E6%8C%87%E4%BB%A4&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:critical%E6%8C%87%E4%BB%A4&quot;&gt;critical指令&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;critical指令用于指定一个代码块为临界区。语法为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma omp critical [(name)]
{
    code_block
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;

int main() {
    std::vector&amp;lt;int&amp;gt; nums = {2, 3, 12, 43, 4, 21, 54, 35, 34, 5, 2435, 3425, 34, 5};

    int max = nums[0];

    #pragma omp parallel for
    for (int i = 1; i &amp;lt; nums.size(); ++i) {
        if (nums[i] &amp;gt; max) {
            #pragma omp critical
            {
                if (nums[i] &amp;gt; max)
                    max = nums[i];
            }
        }
    }

    std::cout &amp;lt;&amp;lt; max &amp;lt;&amp;lt; std::endl;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果为：3425&lt;/p&gt;
&lt;p&gt;这个程序设计得不好，求最大值或者最小值显然是满足交换率和结合率的，应当使用归约来求。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;#openmp%E5%AD%90%E5%8F%A5&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:openmp%E5%AD%90%E5%8F%A5&quot;&gt;OpenMP子句&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在c/c++中，OpenMP的基本使用方法为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma omp directives [clause[[,] clause] ... ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;OpenMP子句有：&lt;code&gt;if, num_threads, private, reduction&lt;/code&gt;等。&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;#if%E5%AD%90%E5%8F%A5&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:if%E5%AD%90%E5%8F%A5&quot;&gt;if子句&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;if子句用于指定接下来的代码块是否并行，可以出现在parallel、for和sections后面。如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;std::vector&amp;lt;int&amp;gt; add(const std::vector&amp;lt;int&amp;gt; &amp;amp;v1,
                     const std::vector&amp;lt;int&amp;gt; &amp;amp;v2,
                     bool parallel = true) {
    std::vector&amp;lt;int&amp;gt; v3(v1.size());

    #pragma omp parallel for if (parallel)
    for (int i = 0; i &amp;lt; v1.size(); ++i)
        v3[i] = v1[i] + v2[i];

    return v3;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当传入的参数parallel为false时两个向量执行串行加法。&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;#num_threads%E5%AD%90%E5%8F%A5&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:num_threads%E5%AD%90%E5%8F%A5&quot;&gt;num_threads子句&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;num_threads子句用于指定并行的线程数量，可以出现在parallel、for和sections后面。如sections指令一节的示例程序输出结果的线程编号不是预期的0, 1, 2, 3的排列，这是因为默认使用8个线程进行并行，将其改成4个线程：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma omp parallel sections num_threads(4)
{
    #pragma omp section
    printf(&quot;section1, thread id is %d\n&quot;, omp_get_thread_num());

    #pragma omp section
    printf(&quot;section2, thread id is %d\n&quot;, omp_get_thread_num());

    #pragma omp section
    printf(&quot;section3, thread id is %d\n&quot;, omp_get_thread_num());

    #pragma omp section
    printf(&quot;section4, thread id is %d\n&quot;, omp_get_thread_num());
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;section4, thread id is 3
section3, thread id is 2
section2, thread id is 0
section1, thread id is 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;a href=&quot;#private%E5%AD%90%E5%8F%A5&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:private%E5%AD%90%E5%8F%A5&quot;&gt;private子句&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;private子句用于将一个或多个变量声明成线程私有的变量，线程间无法相互访问这个变量，也无法访问并行区域外的同名共享变量。例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int n = 1;
#pragma omp parallel for private(n)
for (n = 8; n &amp;lt; 12; ++n)
    printf(&quot;%d\n&quot;, n);
printf(&quot;%d\n&quot;, n);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果为：&lt;code&gt;8 11 10 9 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;因此以private声明的变量和并行区域外的同名变量没有任何联系。&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;#reduction%E5%AD%90%E5%8F%A5&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:reduction%E5%AD%90%E5%8F%A5&quot;&gt;reduction子句&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;reduction的功能如例2所述，可以出现在parallel、for和sections之后。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;#openmp%E5%87%BD%E6%95%B0&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:openmp%E5%87%BD%E6%95%B0&quot;&gt;OpenMP函数&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在c/c++中，使用OpenMP的函数需要包含头文件&lt;code&gt;&amp;lt;omp.h&amp;gt;&lt;/code&gt;。以下为一个简单的函数列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 设置并行区域线程数
void omp_set_num_threads(int _Num_threads);

// 返回当前线程数目，在串行代码中调用将返回1
int omp_get_num_threads(void);

// 返回程序的最大可用线程数量
int omp_get_max_threads(void);

// 返回当前线程id，从0开始编号
int omp_get_thread_num(void);

// 返回程序可用的处理器数
int omp_get_num_procs(void);

// 启用或禁用可用线程数的动态调整(缺省情况下启用动态调整)。
void omp_set_dynamic(int _Dynamic_threads);

// 确定在程序中此处是否启用了动态线程调整。
int omp_get_dynamic(void);

// 确定线程是否在并行区域的动态范围内执行
int omp_in_parallel(void);

// 启用或禁用嵌套并行操作
void omp_set_nested(int _Nested);

// 确定在程序中此处是否启用了嵌套并行操作
int omp_get_nested(void);


// 初始化一个（嵌套）互斥锁
void omp_init_lock(omp_lock_t * _Lock);
void omp_init_nest_lock(omp_nest_lock_t * _Lock);

// 销毁一个（嵌套）互斥锁并释放内存
void omp_destroy_lock(omp_lock_t * _Lock);
void omp_destroy_nest_lock(omp_nest_lock_t * _Lock);

// 获得一个（嵌套）互斥锁
void omp_set_lock(omp_lock_t * _Lock);
void omp_set_nest_lock(omp_nest_lock_t * _Lock);

// 释放一个（嵌套）互斥锁
void omp_unset_lock(omp_lock_t * _Lock);
void omp_unset_nest_lock(omp_nest_lock_t * _Lock);

// 试图获得一个（嵌套）互斥锁，并在成功时放回真，失败时返回假
int omp_test_lock(omp_lock_t * _Lock);
int omp_test_nest_lock(omp_nest_lock_t * _Lock);

// 从过去的某一时刻经历的时间，一般用于成对出现，进行时间比较
double omp_get_wtime(void);

// 得到clock ticks的秒数
double omp_get_wtick(void);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;random&amp;gt;
#include &amp;lt;omp.h&amp;gt;

int main() {
    const int N = 100000000;   // 一亿
    std::vector&amp;lt;double&amp;gt; A(N);

    std::uniform_real_distribution&amp;lt;double&amp;gt; dist(0, 10);
    std::random_device rd;

    double start = 0;
    double end = 0;
    double elapsed = 0;

    // 串行
    start = omp_get_wtime();
    std::default_random_engine re{rd()};
    for (int i = 0; i &amp;lt; N; i++)
        A[i] = dist(re);
    end = omp_get_wtime();
    elapsed = end - start;
    std::cout &amp;lt;&amp;lt; &quot;generate &quot; &amp;lt;&amp;lt; N &amp;lt;&amp;lt; &quot; numbers in series elapsed: &quot;
              &amp;lt;&amp;lt; elapsed &amp;lt;&amp;lt; &quot; s&quot; &amp;lt;&amp;lt; std::endl;

    // 并行
    start = omp_get_wtime();
    #pragma omp parallel
    {
        int num_threads = omp_get_num_threads();
        std::default_random_engine re{rd()};
        for (int i = omp_get_thread_num(); i &amp;lt; N; i += num_threads)
            A[i] = dist(re);
    }
    end = omp_get_wtime();
    elapsed = end - start;
    std::cout &amp;lt;&amp;lt; &quot;generate &quot; &amp;lt;&amp;lt; N &amp;lt;&amp;lt; &quot; numbers in parallel elapsed: &quot;
              &amp;lt;&amp;lt; elapsed &amp;lt;&amp;lt; &quot; s&quot; &amp;lt;&amp;lt; std::endl;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;generate 100000000 numbers in series elapsed: 6.45648 s
generate 100000000 numbers in parallel elapsed: 1.18125 s
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a href=&quot;#%E5%8F%82%E8%80%83&quot;&gt;§&lt;/a&gt;&lt;a href=&quot;#contents:%E5%8F%82%E8%80%83&quot;&gt;参考&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;[1] OpenMP标准：https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://w-jin.github.io/tags/openmp/&quot;&gt;OpenMP&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Jupyter工作站配置</title><link>https://tuoyuangui.github.io/website/posts/typora/%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/jupyter%E5%B7%A5%E4%BD%9C%E7%AB%99/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/jupyter%E5%B7%A5%E4%BD%9C%E7%AB%99/</guid><pubDate>Wed, 12 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Jupyter工作站配置&lt;/h1&gt;
&lt;h2&gt;1、安装 jupyter notebook&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;conda install jupyter
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、配置Jupyter-config&lt;/h2&gt;
&lt;h3&gt;2.1、生成jupyter配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;jupyter-notebook --generate-config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该命令执行后会生成&lt;code&gt;./jupyter/jupyter_notebook_config.py&lt;/code&gt;的文件&lt;/p&gt;
&lt;h3&gt;2.2 修改Jupyter_notebook_config.py该配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;c.NotebookApp.ip = &apos;&apos;   # 设置访问IP（工作站静态IP）

c.NotebookApp.open_browser = False  # 默认不自动打开浏览器

c.NotebookApp.password = &apos;&apos;            # 输入刚刚生成的密钥

c.NotebookApp.port = 8888            # 设置端口， 其他端口应该也是可以的

c.NotebookApp.notebook_dir = &apos;&apos;   # 设置Jupyternotebook 打开的根目录
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述代码&lt;code&gt;c.NotebookApp.password = &apos;&apos;&lt;/code&gt;的设置，需要你在服务器上依次执行如下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python
from notebook.auth import passwd
passwd()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大概如图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Jupyter%E5%B7%A5%E4%BD%9C%E7%AB%99.assets/image-20241118203036245.png&quot; alt=&quot;image-20241118203036245&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Jupyter%E5%B7%A5%E4%BD%9C%E7%AB%99.assets/clip_image001.png&quot; alt=&quot;计算机生成了可选文字: (Imgseg)wuguanghui@node/&amp;gt;python python3．7．7(default,May72929，21：25：33〕 [GCC7．3．G] Anaconda,．On Type&amp;quot;help&amp;quot; &amp;quot;copyright 0r到 &amp;gt;&amp;gt;&amp;gt;fromnotebook.authimportpasswd &amp;gt;&amp;gt;&amp;gt;passwd()&apos; rrermatIOn&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后运行完passwd()之后会得到一串密码，放入&lt;code&gt;c.NotebookApp.password = &apos;&apos;&lt;/code&gt;里面。&lt;/p&gt;
&lt;p&gt;上述代码&lt;code&gt;c.NotebookApp.notebook_dir = &apos;&apos;&lt;/code&gt;的设置，这里你需要在引号中加入路径即可。&lt;/p&gt;
&lt;p&gt;或者&lt;code&gt;jupyter notebook password&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Jupyter%E5%B7%A5%E4%BD%9C%E7%AB%99.assets/clip_image002.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Reference：&lt;/h2&gt;
&lt;p&gt;【1】https://blog.csdn.net/W_nihao_123456/article/details/108421145&lt;/p&gt;
</content:encoded></item><item><title>Docker 安装 实现docker默认安装目录修改</title><link>https://tuoyuangui.github.io/website/posts/typora/%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/docker%E5%AE%89%E8%A3%85/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/docker%E5%AE%89%E8%A3%85/</guid><pubDate>Sun, 12 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Docker 安装 实现docker默认安装目录修改&lt;/h1&gt;
&lt;h2&gt;一、安装&lt;/h2&gt;
&lt;p&gt;查看 Windows 上安装 Docker Desktop官方安装指南：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://docs.docker.com/desktop/install/windows-install/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;1、提前在D盘新建Program\Docker，使用这行代码安装：&lt;/p&gt;
&lt;p&gt;&quot;Docker Desktop Installer.exe&quot;  install --installation-dir=&quot;PATH&quot;&lt;/p&gt;
&lt;p&gt;2、&quot; &quot; 里面为你的Docker Desktop Installer.exe文件存放目录，PATH替换你想要安装路径：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;D:\Download\Docker Desktop Installer.exe&quot;  install --installation-dir=&quot;D:\Program\Docker&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./docker%E5%AE%89%E8%A3%85.assets/2900655-20231201122245512-409940175.png&quot; alt=&quot;Image 14&quot; /&gt;&lt;/p&gt;
&lt;p&gt;3、最后显示Installation succeeded代表安装成功。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker%E5%AE%89%E8%A3%85.assets/2900655-20231201122329147-1124343577.png&quot; alt=&quot;Image 15&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;二、更改镜像默认保存路径&lt;/h2&gt;
&lt;p&gt;1、运行docker，进入设置页，点击Resources选项，发现镜像默认安装在%UserProfile%\AppData\Local\Docker\wsl目录下&lt;/p&gt;
&lt;p&gt;2、点击Browse按钮，选择自定义的其他盘路径，例如：D:\Program\&lt;/p&gt;
&lt;p&gt;如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker%E5%AE%89%E8%A3%85.assets/2900655-20231201134518986-2004247954.png&quot; alt=&quot;Image 16&quot; /&gt;&lt;/p&gt;
&lt;p&gt;3、最后点击Apply &amp;amp; restart按钮重启Docker即可生效。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker%E5%AE%89%E8%A3%85.assets/2900655-20231201134614499-797892774.png&quot; alt=&quot;Image 17&quot; /&gt;&lt;/p&gt;
&lt;p&gt;4、docker会自动在选定的目录下增加子目录DockerDesktopWSL。&lt;/p&gt;
&lt;p&gt;当然除以上方法还有很多中可以修改docker默认安装路径 及 docker镜像的。&lt;/p&gt;
&lt;p&gt;例如：软链接方法；WSL命令备份、导入方法等等，大家可以自行搜索一下。&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】https://www.cnblogs.com/luzhuangzhi/p/17869210.html&lt;/p&gt;
&lt;p&gt;【2】&lt;a href=&quot;https://docker.easydoc.net/doc/81170005/cCewZWoN/AWOEX9XM&quot;&gt;💻 Docker 快速安装软件 - Docker 快速入门 - 易文档 (easydoc.net)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>CUDA性能分析</title><link>https://tuoyuangui.github.io/website/posts/typora/cuda/cuda%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/cuda/cuda%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90/</guid><pubDate>Thu, 12 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;CUDA性能分析&lt;/h1&gt;
&lt;h2&gt;命令&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;nsys profile --stats=true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;示例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;iguolong@node01:~/SOFTWARE/LGLSOFTWARE/src/2D/fdtd$ nsys profile --stats=true ./gpu2dafdshots  vp=vel.rsf  den=den.rsf geo=geo.txt nbell=2  npml=10 fm=7 freesrf=y log=log.txt int NGPU=2 GPU_lists=0,2
WARNING: CPU IP/backtrace sampling not supported, disabling.
Try the &apos;nsys status --environment&apos; command to learn more.

WARNING: CPU context switch tracing not supported, disabling.
Try the &apos;nsys status --environment&apos; command to learn more.

Generating &apos;/tmp/nsys-report-dd6b.qdstrm&apos;
[1/8] [========================100%] report1.nsys-rep
[2/8] [========================100%] report1.sqlite
[3/8] Executing &apos;nvtxsum&apos; stats report
SKIPPED: /data1/Uers_Login/liguolong/SOFTWARE/LGLSOFTWARE/src/2D/fdtd/report1.sqlite does not contain NV Tools Extension (NVTX) data.

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​    [4/8] Executing &apos;osrtsum&apos; stats report&lt;/p&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Time (%)  Total Time (ns)  Num Calls    Avg (ns)       Med (ns)      Min (ns)     Max (ns)     StdDev (ns)            Name
 44.3    1,742,654,423         35   49,790,126.4   29,092,600.0        1,565  239,680,504   56,054,598.9  poll
 25.7    1,009,566,364          4  252,391,591.0  160,490,033.0   30,028,539  658,557,759  277,831,157.7  sem_wait
 25.4    1,000,183,939          2  500,091,969.5  500,091,969.5  500,084,193  500,099,746       10,997.6  pthread_cond_timedwait
  3.0      116,840,484      1,197       97,611.1       11,747.0        1,033   15,257,078      792,696.0  ioctl
  1.0       38,133,974         12    3,177,831.2        5,009.0        1,401   38,041,261   10,979,139.6  fgets
  0.4       14,183,720          1   14,183,720.0   14,183,720.0   14,183,720   14,183,720            0.0  dup
  0.1        4,953,654         16      309,603.4        1,861.0        1,141    4,924,647    1,230,678.5  read
  0.1        3,183,639         55       57,884.3       10,100.0        5,280      963,461      177,045.2  mmap64
  0.0          700,807         18       38,933.7       22,897.5       11,785      119,303       36,505.9  sem_timedwait
  0.0          538,426         35       15,383.6        7,186.0        1,550      189,496       32,771.7  mmap
  0.0          489,544          1      489,544.0      489,544.0      489,544      489,544            0.0  popen
  0.0          464,601         96        4,839.6        4,271.5        1,888       11,338        1,812.6  open64
  0.0          424,590          7       60,655.7       63,006.0       39,092       68,901        9,969.2  pthread_create
  0.0          416,040         92        4,522.2        2,548.5        1,117       58,340        7,089.2  fopen
  0.0          262,854         51        5,154.0        3,291.0        1,146       33,709        5,664.8  fread
  0.0          218,350          2      109,175.0      109,175.0        6,742      211,608      144,862.1  send
  0.0          198,363          1      198,363.0      198,363.0      198,363      198,363            0.0  pthread_mutex_lock
  0.0          165,822         10       16,582.2        8,688.0        5,319       76,080       21,510.9  fflush
  0.0          127,939         50        2,558.8        1,705.0        1,003       18,410        2,843.2  fclose
  0.0           86,016          8       10,752.0        3,164.0        1,003       59,719       20,041.5  recvmsg
  0.0           74,485          1       74,485.0       74,485.0       74,485       74,485            0.0  pthread_cond_wait
  0.0           44,252          9        4,916.9        4,474.0        1,885        7,006        1,720.7  munmap
  0.0           28,084          5        5,616.8        4,728.0        2,872       10,850        3,041.8  pthread_cond_broadcast
  0.0           27,774         16        1,735.9        1,601.0        1,097        2,633          533.3  write
  0.0           24,613          6        4,102.2        4,925.0        1,263        6,413        2,100.4  open
  0.0           21,356          5        4,271.2        3,835.0        3,288        6,142        1,179.1  freopen
  0.0           18,862          3        6,287.3        7,239.0        3,818        7,805        2,157.1  socket
  0.0           15,586          3        5,195.3        5,928.0        3,097        6,561        1,844.6  pipe2
  0.0           14,706          4        3,676.5        2,687.0        1,967        7,365        2,514.5  fwrite
  0.0           14,072          1       14,072.0       14,072.0       14,072       14,072            0.0  connect
  0.0           10,824          2        5,412.0        5,412.0        4,800        6,024          865.5  fopen64
  0.0           10,018          6        1,669.7        1,693.0        1,031        2,176          410.2  fcntl
  0.0            6,324          1        6,324.0        6,324.0        6,324        6,324            0.0  putc
  0.0            4,877          2        2,438.5        2,438.5        2,001        2,876          618.7  bind
  0.0            1,009          1        1,009.0        1,009.0        1,009        1,009            0.0  fputs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[5/8] Executing &apos;cudaapisum&apos; stats report&lt;/p&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt; Time (%)  Total Time (ns)  Num Calls  Avg (ns)   Med (ns)   Min (ns)  Max (ns)   StdDev (ns)           Name
  92.6      497,094,802    120,054    4,140.6    4,068.0     3,283    728,164     3,541.6  cudaLaunchKernel
  6.2       33,100,190      2,235   14,809.9    3,638.0     2,852  9,293,949    304,133.2  cudaMemcpyAsync
  0.5        2,602,744         90   28,919.4    5,115.5       245    424,303     82,776.6  cudaFree
  0.3        1,829,814         78   23,459.2    6,066.0     3,972    251,066     49,384.5  cudaMalloc
  0.2        1,332,591          2  666,295.5  666,295.5    19,398  1,313,193    914,851.2  cudaHostAlloc
  0.1          427,207         78    5,477.0    4,941.5     2,507     19,464      2,742.1  cudaMemsetAsync
  0.1          401,078          2  200,539.0  200,539.0    18,862    382,216    256,930.1  cudaFreeHost
  0.0           93,598          2   46,799.0   46,799.0    22,372     71,226     34,545.0  cudaMemset
  0.0           43,855          3   14,618.3    8,381.0     6,087     29,387     12,841.4  cudaStreamCreate
  0.0           42,362          6    7,060.3    6,619.0     4,485     11,430      2,742.8  cudaEventRecord
  0.0           18,465          6    3,077.5    1,425.5       464      8,707      3,401.4  cudaEventCreate
  0.0           17,320          3    5,773.3    6,277.0     4,083      6,960      1,503.2  cudaStreamDestroy
  0.0           10,439          3    3,479.7    3,867.0     1,953      4,619      1,374.6  cudaStreamSynchronize
  0.0            8,055          3    2,685.0    2,640.0     2,544      2,871        168.1  cudaEventSynchronize
  0.0            5,019          6      836.5      696.5       365      1,565        526.0  cudaEventDestroy
  0.0            1,400          1    1,400.0    1,400.0     1,400      1,400          0.0  cuModuleGetLoadingMode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[6/8] Executing &apos;gpukernsum&apos; stats report&lt;/p&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt; Time (%)  Total Time (ns)  Instances  Avg (ns)  Med (ns)  Min (ns)  Max (ns)  StdDev (ns)     GridXYZ         BlockXYZ               Name
 36.4      163,783,064     30,003   5,458.9   5,728.0     4,864     6,400        378.1    13   25    1    16   16    1  _kernel_Acoustic2d_cpml_t
 32.4      146,070,544     30,003   4,868.5   5,088.0     4,383     5,728        335.5    13   25    1    16   16    1  _kernel_Acoustic2d_cpml_v
 15.9       71,828,147     30,003   2,394.0   2,495.0     2,175     3,135        146.8    24    1    1    16    1    1  _kernel_seis2d_record
 15.2       68,640,277     30,003   2,287.8   2,336.0     2,079     2,944        133.5     5    5    1     1    1    1  _kernel_add2d_bellwlt
  0.0           14,336          6   2,389.3   2,448.0     2,208     2,528        144.1    14   25    1     1   16    1  _kernel_mod2d_pad_z1
  0.0           13,248          6   2,208.0   2,272.0     2,016     2,304        126.4    13   14    1    16    1    1  _kernel_mod2d_pad_x0
  0.0           13,184          6   2,197.3   2,256.0     2,016     2,304        130.6    13   14    1    16    1    1  _kernel_mod2d_pad_x1
  0.0           13,152          6   2,192.0   2,256.0     1,984     2,272        119.3     4   25    1     1   16    1  _kernel_mod2d_pad_z0
  0.0           12,321          3   4,107.0   4,129.0     3,904     4,288        192.9    13   25    1    16   16    1  _kernel_vel_trans2d
  0.0            9,120          3   3,040.0   2,976.0     2,656     3,488        419.7   626    1    1    16    1    1  _kernel_pro_2d_sou_P
  0.0            7,360          3   2,453.3   2,528.0     2,272     2,560        157.9    10   25    1     1   16    1  _kernel_cpml2d_abcz1
  0.0            6,752          3   2,250.7   2,336.0     2,080     2,336        147.8    13   10    1    16    1    1  _kernel_cpml2d_abcx0
  0.0            6,720          3   2,240.0   2,304.0     2,080     2,336        139.5    13   10    1    16    1    1  _kernel_cpml2d_abcx1
  0.0            5,792          3   1,930.7   1,984.0     1,792     2,016        121.2     5    5    1     1    1    1  _kernel_bell2d_coff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[7/8] Executing &apos;gpumemtimesum&apos; stats report&lt;/p&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Time (%)  Total Time (ns)  Count   Avg (ns)     Med (ns)    Min (ns)   Max (ns)   StdDev (ns)      Operation
 86.8       22,741,397      3  7,580,465.7  7,258,355.0  7,136,657  8,346,385    666,090.8  [CUDA memcpy DtoH]
 12.3        3,222,238  2,232      1,443.7      1,440.0        864      4,800        174.3  [CUDA memcpy HtoD]
  0.9          236,702     80      2,958.8      2,240.0        831     21,536      4,038.6  [CUDA memset]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[8/8] Executing &apos;gpumemsizesum&apos; stats report&lt;/p&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Total (MB)  Count  Avg (MB)  Med (MB)  Min (MB)  Max (MB)  StdDev (MB)      Operation
 51.246     80     0.641     0.008     0.000    14.761        2.808  [CUDA memset]
 44.284      3    14.761    14.761    14.761    14.761        0.000  [CUDA memcpy DtoH]
  1.795  2,232     0.001     0.001     0.000     0.040        0.001  [CUDA memcpy HtoD]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Generated:
/data1/Uers_Login/liguolong/SOFTWARE/LGLSOFTWARE/src/2D/fdtd/report1.nsys-rep
/data1/Uers_Login/liguolong/SOFTWARE/LGLSOFTWARE/src/2D/fdtd/report1.sqlite&lt;/p&gt;
</content:encoded></item><item><title>C 库函数 - perror()</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/perror%E5%87%BD%E6%95%B0%E6%89%93%E5%8D%B0%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/perror%E5%87%BD%E6%95%B0%E6%89%93%E5%8D%B0%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF/</guid><pubDate>Thu, 12 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;C 库函数 - perror()&lt;/h1&gt;
&lt;h2&gt;描述&lt;/h2&gt;
&lt;p&gt;C 库函数 &lt;strong&gt;void perror(const char *str)&lt;/strong&gt; 把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 &lt;strong&gt;str&lt;/strong&gt;，后跟一个冒号，然后是一个空格。&lt;/p&gt;
&lt;h2&gt;声明&lt;/h2&gt;
&lt;p&gt;下面是 perror() 函数的声明。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void perror(const char *str)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;参数&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;str&lt;/strong&gt; -- 这是 C 字符串，包含了一个自定义消息，将显示在原本的错误消息之前。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;返回值&lt;/h2&gt;
&lt;p&gt;该函数不返回任何值。&lt;/p&gt;
&lt;h2&gt;实例&lt;/h2&gt;
&lt;p&gt;下面的实例演示了 perror() 函数的用法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main ()
{
   FILE *fp;

   /* 首先重命名文件 */
   rename(&quot;file.txt&quot;, &quot;newfile.txt&quot;);

   /* 现在让我们尝试打开相同的文件 */
   fp = fopen(&quot;file.txt&quot;, &quot;r&quot;);
   if( fp == NULL ) {
      perror(&quot;Error: &quot;);
      return(-1);
   }
   fclose(fp);

   return(0);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;让我们编译并运行上面的程序，这将产生以下结果，因为我们尝试打开一个不存在的文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Error: : No such file or directory
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://www.runoob.com/cprogramming/c-function-perror.html&quot;&gt;C 库函数 – perror() | 菜鸟教程 (runoob.com)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>fftw 编译安装教程</title><link>https://tuoyuangui.github.io/website/posts/typora/%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/fftw/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/fftw/</guid><pubDate>Thu, 12 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;fftw 编译安装教程&lt;/h1&gt;
&lt;h2&gt;1、DFT &amp;amp;&amp;amp; FFT-&amp;gt; FFTW&lt;/h2&gt;
&lt;p&gt;DFT（Discrete Fourier Transform），即离散傅里叶变换，是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其DTFT的频域采样。&lt;/p&gt;
&lt;p&gt;FFT（Fast Fourier Transformation），即为快速傅氏变换，是离散傅氏变换（DFT）的快速算法，它是根据离散傅氏变换的奇、偶、虚、实等特性，对离散傅立叶变换的算法进行改进获得的。&lt;/p&gt;
&lt;p&gt;FFTW ( the Faster Fourier Transform in the West)是一个快速计算离散傅里叶变换的标准C语言程序集，其由MIT的M.Frigo和S. Johnson开发。可计算一维或多维实和复数据以及任意规模的DFT。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&quot;http://www.fftw.org/&quot;&gt;传送门 (opens new window)&lt;/a&gt;，下载地址：&lt;a href=&quot;http://www.fftw.org/download.html&quot;&gt;传送门 (opens new window)&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;2 、FFTW库所需的编译环境&lt;/h2&gt;
&lt;p&gt;GNU Compiler + MPI Compiler （如果编译mpi版的fftw）&lt;/p&gt;
&lt;h3&gt;2.1 默认编译&lt;/h3&gt;
&lt;p&gt;​	安装fftw仅需要遵循常见的三步骤即可（configure+make+make install），在这里先介绍一下默认安装，再然着重介绍一些configure的配置选项。&lt;/p&gt;
&lt;p&gt;以fftw-3.3.6-pl2.tar.gz为例，先从官网下载该压缩包。解压缩，并进入源码目录进行编译即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tar zxvf fftw-3.3.6-pl2.tar.gz
$ cd fftw-3.3.6-pl2
$ ./configure
$ make
$ make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就可以把fftw库按照默认配置，安装到默认的路径下。 使用的是GNU的编译器，安装到的是/usr/local下面。&lt;/p&gt;
&lt;h3&gt;2.2 优化编译参数介绍&lt;/h3&gt;
&lt;p&gt;但是，我们通常会依据./configure -help得到的信息来添加一些参数来达到优化编译的目录。 接下来我们使用命令查看一些常用配置参数：&lt;/p&gt;
&lt;p&gt;设定安装目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Installation directories:
--prefix=PREFIX    install architecture-independent files in PREFIX[/usr/local]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否编译动态库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Optional Features:
--enable-shared[=PKGS]    build shared libraries [default=no]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否编译静态库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--enable-static[=PKGS]    build static libraries [default=yes]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否编译单精度版本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--enable-single         compile fftw in single precision
--enable-float          synonym for --enable-single
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开启针对特定机器架构的优化，这个取决于机器CPU（下面有介绍）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--enable-sse            enable SSE optimizations
--enable-sse2           enable SSE/SSE2 optimizations
--enable-avx            enable AVX optimizations
--enable-avx2           enable AVX2 optimizations
--enable-neon           enable ARM NEON optimizations
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开启积和熔加运算(Fused Multiply-Add/FMA)的优化&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--enable-fma            enable optimizations for machineswith fused multiply-add
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否编译mpi版的fftw库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--enable-mpi            compile FFTW MPI library
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否使用OpenMP指令进行并行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--enable-openmp         use OpenMP directives for parallelism
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否编译FFTW SMP线程库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--enable-threads        compile FFTW SMP threads library
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这部分是指定编译器及编译参数，默认是用GNU的编译器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  CPP         C preprocessor
  MPICC       MPI C compiler command
  F77         Fortran 77 compiler command
  FFLAGS      Fortran 77 compiler flags
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了用intel的编译器，我们需要特别指定一下：CC=icc F77=ifort，相关的参数通常保持默认即可。&lt;/p&gt;
&lt;p&gt;备注： 1）如何查看CPU是否支持某个指令集呢？使用如下命令可以列出支持的指令集名称&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /proc/cpuinfo | grep flags | uniq
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2）SIMD SIMD单指令流多数据流(SingleInstructionMultiple Data,SIMD)是一种采用一个控制器来控制多个处理器，同时对一组数据（又称“数据向量”）中的每一个分别执行相同的操作从而实现空间上的并行性的技术。&lt;/p&gt;
&lt;p&gt;MMX是由英特尔开发的一种SIMD多媒体指令集，SSE（Streaming SIMDExtensions）是MMX的扩充指令集，AVX（Advanced VectorExtensions）是Intel的SSE延伸架构，FMA（Fused MultiplyAccumulate）是Intel的AVX扩充指令集。&lt;/p&gt;
&lt;p&gt;NEON实际上是ARM的SIMD（Single InstructionMultiple Data）技术的延续，它是一个结合64和128 bit的SIMD（Single InstructionMultiple Data 单指令多重数据）指令集。&lt;/p&gt;
&lt;h3&gt;2.3、 优化编译单精度版本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# sigle
./configure --prefix=/public/home/ac30u77fum/rsfroot/mathlib/fftw-3.3.10 CC=gcc F77=gfortran MPICC=mpicc  --enable-shared --enable-static --enable-float --enable-see --enable-sse2 --enable-avx --enable-avx2 --enable-fma --enable-mpi --enable-threads --enable-openmp

make
make install

# double
./configure --prefix=/public/home/ac30u77fum/rsfroot/mathlib/fftw-3.3.10 CC=gcc F77=gfortran MPICC=mpicc  --enable-shared --enable-static --enable-see --enable-sse2 --enable-avx --enable-avx2 --enable-fma --enable-mpi --enable-threads --enable-openmp
make
make install
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、软件&lt;/h2&gt;
&lt;p&gt;通常会用到的是libfftw.a以及一些头文件，在编译或链接的时候，给出它的路径即可。&lt;/p&gt;
&lt;p&gt;比如： gromacs软件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  -DFFTWF_LIBRARY=&quot;$HOME/software/fftw/3.3.6-pl2-icc13&quot;
  -DFFTWF_INCLUDE_DIR=&quot;$HOME/fftw/include/&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里介绍的是官网题的fftw库，我们还可以使用Intel MKL库中的fftw接口。&lt;/p&gt;
&lt;p&gt;环境变量：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./FFTW.assets/image-20240528083721987.png&quot; alt=&quot;image-20240528083721987&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://nscc.mrzhenggang.com/fftw/#%E4%BB%80%E4%B9%88%E6%98%AFdft&quot;&gt;fftw 编译安装教程 | 超算小站 (mrzhenggang.com)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Bash Shell 快捷键</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/shell%E5%BF%AB%E6%8D%B7%E9%94%AE/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/shell%E5%BF%AB%E6%8D%B7%E9%94%AE/</guid><pubDate>Mon, 12 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Bash Shell 快捷键&lt;/h1&gt;
&lt;p&gt;在 Bash shell 中，熟记以下快捷键，将极大的提高你的命令行操作效率。&lt;/p&gt;
&lt;h2&gt;编辑命令&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + a ：移到命令行首&lt;/li&gt;
&lt;li&gt;Ctrl + e ：移到命令行尾&lt;/li&gt;
&lt;li&gt;Ctrl + f ：按字符前移（右向）&lt;/li&gt;
&lt;li&gt;Ctrl + b ：按字符后移（左向）&lt;/li&gt;
&lt;li&gt;Alt + f ：按单词前移（右向）&lt;/li&gt;
&lt;li&gt;Alt + b ：按单词后移（左向）&lt;/li&gt;
&lt;li&gt;Ctrl + xx：在命令行首和光标之间移动&lt;/li&gt;
&lt;li&gt;Ctrl + u ：从光标处删除至命令行首&lt;/li&gt;
&lt;li&gt;Ctrl + k ：从光标处删除至命令行尾&lt;/li&gt;
&lt;li&gt;Ctrl + w ：从光标处删除至字首&lt;/li&gt;
&lt;li&gt;Alt + d ：从光标处删除至字尾&lt;/li&gt;
&lt;li&gt;Ctrl + d ：删除光标处的字符&lt;/li&gt;
&lt;li&gt;Ctrl + h ：删除光标前的字符&lt;/li&gt;
&lt;li&gt;Ctrl + y ：粘贴至光标后&lt;/li&gt;
&lt;li&gt;Alt + c ：从光标处更改为首字母大写的单词&lt;/li&gt;
&lt;li&gt;Alt + u ：从光标处更改为全部大写的单词&lt;/li&gt;
&lt;li&gt;Alt + l ：从光标处更改为全部小写的单词&lt;/li&gt;
&lt;li&gt;Ctrl + t ：交换光标处和之前的字符&lt;/li&gt;
&lt;li&gt;Alt + t ：交换光标处和之前的单词&lt;/li&gt;
&lt;li&gt;Alt + Backspace：与 Ctrl + w &lt;s&gt;相同&lt;/s&gt;类似，分隔符有些差别&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + c -- 取消当前行输入的命令，相当于Ctrl + Break。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + s -- 暂停当前终端。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + q -- 恢复当前终端。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + z -- 后端运行。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + l -- 清空屏幕并重新显示当前命令行内容&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;重新执行命令&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + r：逆向搜索命令历史&lt;/li&gt;
&lt;li&gt;Ctrl + g：从历史搜索模式退出&lt;/li&gt;
&lt;li&gt;Ctrl + p：历史中的上一条命令&lt;/li&gt;
&lt;li&gt;Ctrl + n：历史中的下一条命令&lt;/li&gt;
&lt;li&gt;Alt + .：使用上一条命令的最后一个参数&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;控制命令&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + l（L）：清屏&lt;/li&gt;
&lt;li&gt;Ctrl + o：执行当前命令，并选择上一条命令&lt;/li&gt;
&lt;li&gt;Ctrl + s：阻止屏幕输出&lt;/li&gt;
&lt;li&gt;Ctrl + q：允许屏幕输出&lt;/li&gt;
&lt;li&gt;Ctrl + c：终止命令&lt;/li&gt;
&lt;li&gt;Ctrl + z：挂起命令&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Bang (!) 命令&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;!!：执行上一条命令&lt;/li&gt;
&lt;li&gt;!blah：执行最近的以 blah 开头的命令，如 !ls&lt;/li&gt;
&lt;li&gt;!blah:p：仅打印输出，而不执行&lt;/li&gt;
&lt;li&gt;!$：上一条命令的最后一个参数，与 Alt + . 相同&lt;/li&gt;
&lt;li&gt;!*：上一条命令的所有参数&lt;/li&gt;
&lt;li&gt;^blah：删除上一条命令中的 blah&lt;/li&gt;
&lt;li&gt;^blah^foo：将上一条命令中的 blah 替换为 foo&lt;/li&gt;
&lt;li&gt;^blah^foo^：将上一条命令中所有的 blah 都替换为 foo&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】[让你提升命令行效率的 Bash 快捷键 &lt;a href=&quot;https://linuxtoy.org/archives/bash-shortcuts.html&quot;&gt;完整版] · LinuxTOY&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>环境变量和动态库、静态库配置</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/c%E8%AF%AD%E8%A8%80%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%8A%A8%E6%80%81%E5%BA%93%E9%9D%99%E6%80%81%E5%BA%93%E9%85%8D%E7%BD%AE/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/c%E8%AF%AD%E8%A8%80%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%8A%A8%E6%80%81%E5%BA%93%E9%9D%99%E6%80%81%E5%BA%93%E9%85%8D%E7%BD%AE/</guid><pubDate>Sat, 12 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;环境变量和动态库、静态库配置&lt;/h1&gt;
&lt;h2&gt;1、环境变量&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;配置文件中添加环境变量&lt;/strong&gt;
对所有用户有效修改/etc/profile  /etc/bash.bashrc
对个人有效则修改~/.bashrc&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;在PATH中找到&lt;strong&gt;可执行文件程序的路径&lt;/strong&gt;
export PATH =$PATH:$HOME/bin&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2、C语言默认搜索路径&lt;/h2&gt;
&lt;p&gt;gcc找到头文件的路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    C_INCLUDE_PATH=/usr/include/libxml2:/MyLib
    export C_INCLUDE_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;g++找到头文件的路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
    export CPLUS_INCLUDE_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到动态链接库的路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib
    export LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到静态库的路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    LIBRARY_PATH=$LIBRARY_PATH:/MyLib
    export LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、gcc命令中手动设置搜索路径&lt;/h2&gt;
&lt;p&gt;添加头文件搜索路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; gcc foo.c -I /home/xiaowp/include -o foo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加动态库搜索路径（默认）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc foo.c -L /home/xiaowp/lib -lfoo -o foo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加静态库搜索路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】https://blog.csdn.net/sunxiaopengsun/article/details/74787966&lt;/p&gt;
</content:encoded></item><item><title>MPI 并行指南</title><link>https://tuoyuangui.github.io/website/posts/typora/%E6%8C%87%E5%8D%97/mpi%E5%B9%B6%E8%A1%8C%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E6%8C%87%E5%8D%97/mpi%E5%B9%B6%E8%A1%8C%E6%8C%87%E5%8D%97/</guid><pubDate>Wed, 12 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;MPI 并行指南&lt;/h1&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;MPI是一个跨平台的通信协议，用于编写并行计算机，支持点对点和广播。MPI是一个信息传递应用程序接口，包括协议和语义说明，他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能，大规模性和可移植性。MPI在今天仍为高性能计算的主要模型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MPI 是一个跨语言的通讯协议，用于编写并行计算机。支持点对点和广播。MPI 是一个信息传递应用程序接口，包括协议和和语义说明，他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能，大规模性，和可移植性。MPI 在今天仍为高性能计算的主要模型。&lt;/p&gt;
&lt;p&gt;MPI 可以大概分为两大类：Open MPI 和 MPICH 及其衍生。&lt;/p&gt;
&lt;p&gt;MPICH 实现的比较全面，但是不支持 InfiniBand 这种比较新的硬件和协议。但是它的衍生品例如 Intel MPI 和 MVAPICH 支持比较新的硬件与协议。&lt;/p&gt;
&lt;p&gt;Open MPI 也实现了 MPI 标准，并且应用广泛。它的进程管理比 MPICH 相对比较好。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Open MPI 与 OpenMP 是不同的概念。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;1、Hello world 代码案例&lt;/h2&gt;
&lt;p&gt;让我们来看一下这节课的代码吧，完整的代码在 &lt;a href=&quot;https://github.com/mpitutorial/mpitutorial/tree/gh-pages/tutorials/mpi-hello-world/code/mpi_hello_world.c&quot;&gt;mpi_hello_world.c&lt;/a&gt;。 下面是一些重点内容的摘录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;mpi.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

int main(int argc, char** argv) {
    // 初始化 MPI 环境
    MPI_Init(NULL, NULL);

    // 通过调用以下方法来得到所有可以工作的进程数量
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;world_size);

    // 得到当前进程的秩
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;world_rank);

    // 得到当前进程的名字
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &amp;amp;name_len);

    // 打印一条带有当前进程名字，秩以及
    // 整个 communicator 的大小的 hello world 消息。
    printf(&quot;Hello world from processor %s, rank %d out of %d processors\n&quot;,
           processor_name, world_rank, world_size);

    // 释放 MPI 的一些资源
    MPI_Finalize();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你应该已经注意到搭建一个 MPI 程序的第一步是引入 &lt;code&gt;#include &amp;lt;mpi.h&amp;gt;&lt;/code&gt; 这个头文件。然后 MPI 环境必须以以下代码来初始化：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MPI_Init(int* argc, char*** argv)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;MPI_Init&lt;/code&gt; 的过程中，所有 MPI 的全局变量或者内部变量都会被创建。举例来说，一个通讯器 communicator 会根据所有可用的进程被创建出来（进程是我们通过 mpi 运行时的参数指定的），然后每个进程会被分配独一无二的秩 rank。当前来说，&lt;code&gt;MPI_Init&lt;/code&gt; 接受的两个参数是没有用处的，不过参数的位置保留着，可能以后的实现会需要用到。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;MPI_Init&lt;/code&gt; 之后，有两个主要的函数被调用到了。这两个函数是几乎所有 MPI 程序都会用到的。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MPI_Comm_size(
    MPI_Comm communicator,
    int* size)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;MPI_Comm_size&lt;/code&gt; 会返回 communicator 的大小，也就是 communicator 中可用的进程数量。在我们的例子中，&lt;code&gt;MPI_COMM_WORLD&lt;/code&gt;（这个 communicator 是 MPI 帮我们生成的）这个变量包含了当前 MPI 任务中所有的进程，因此在我们的代码里的这个调用会返回所有的可用的进程数目。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MPI_Comm_rank( MPI_Comm communicator, int* rank)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;MPI_Comm_rank&lt;/code&gt; 这个函数会返回 communicator 中当前进程的 rank。 communicator 中每个进程会以此得到一个从0开始递增的数字作为 rank 值。rank 值主要是用来指定发送或者接受信息时对应的进程。&lt;/p&gt;
&lt;p&gt;我们代码中使用到的一个不太常见的方法是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MPI_Get_processor_name( char* name, int* name_length)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;MPI_Get_processor_name&lt;/code&gt; 会得到当前进程实际跑的时候所在的处理器名字。 代码中最后一个调用是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MPI_Finalize&lt;/code&gt; 是用来清理 MPI 环境的。这个调用之后就没有 MPI 函数可以被调用了。&lt;/p&gt;
&lt;h2&gt;2、运行 MPI hello world 程序&lt;/h2&gt;
&lt;p&gt;现在查看以下代码文件以及代码所在的文件夹，你会看到一个 makefile。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; git clone https://github.com/mpitutorial/mpitutorial
&amp;gt;&amp;gt;&amp;gt; cd mpitutorial/tutorials/mpi-hello-world/code
&amp;gt;&amp;gt;&amp;gt; cat makefile
EXECS=mpi_hello_world
MPICC?=mpicc

all: ${EXECS}

mpi_hello_world: mpi_hello_world.c
    ${MPICC} -o mpi_hello_world mpi_hello_world.c

clean:
    rm ${EXECS}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我的 makefile 会去找 MPICC 这个环境变量。如果你把 MPICH2 装在了本地文件夹里面而不是全局 PATH 下面, 手动设置一下 MPICC 这个环境变量，把它指向你的 mpicc 二进制程序。mpicc 二进制程序其实只是对 gcc 做了一层封装，使得编译和链接所有的 MPI 程序更方便。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; export MPICC=/home/kendall/bin/mpicc
&amp;gt;&amp;gt;&amp;gt; make
/home/kendall/bin/mpicc -o mpi_hello_world mpi_hello_world.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当你的程序编译好之后，它就可以被执行了。不过执行之前你也许会需要一些额外配置。比如如果你想要在好几个节点的集群上面跑这个 MPI 程序的话，你需要配置一个 host 文件（不是 /etc/hosts）。如果你在笔记本或者单机上运行的话，可以跳过下面这一段。&lt;/p&gt;
&lt;p&gt;需要配置的 host 文件会包含你想要运行的所有节点的名称。为了运行方便，你需要确认一下所有这些节点之间能通过 SSH 通信，并且需要根据&lt;a href=&quot;http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html&quot;&gt;设置认证文件这个教程&lt;/a&gt;配置不需要密码的 SSH 访问。 我的 host 文件看起来像这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; cat host_file
cetus1
cetus2
cetus3
cetus4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了用我提供的脚本来运行这个程序，你应该设置一个叫 MPI_HOSTS 的环境变量，把它指向 host 文件所在的位置。我的脚本会自动把这个 host 文件的配置项加到 MPI 启动命令里。如果单机跑的话就不用设置这个环境变量。另外如果你的 MPI 没有装到全局环境的话，你还需要指定 MPIRUN 这个环境变量指向你的 mpirun 二进制程序。&lt;/p&gt;
&lt;p&gt;准备就绪之后你就可以使用这个项目的我提供的 python 脚本来执行程序。脚本在 &lt;em&gt;tutorials&lt;/em&gt; 目录下面，这个脚本可以用来跑我们这个教程里面提到的所有程序（而且它会帮你先编译一下程序）。你可以在 mpitutorial 这个文件夹的根目录下执行以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; export MPIRUN=/home/kendall/bin/mpirun
&amp;gt;&amp;gt;&amp;gt; export MPI_HOSTS=host_file
&amp;gt;&amp;gt;&amp;gt; cd tutorials
&amp;gt;&amp;gt;&amp;gt; ./run.py mpi_hello_world
/home/kendall/bin/mpirun -n 4 -f host_file ./mpi_hello_world
Hello world from processor cetus2, rank 1 out of 4 processors
Hello world from processor cetus1, rank 0 out of 4 processors
Hello world from processor cetus4, rank 3 out of 4 processors
Hello world from processor cetus3, rank 2 out of 4 processors
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;跟预想的一样，这个 MPI 程序运行在了我提供的所有节点上面。每个进程都被分配了一个单独的 rank，跟进程的名字一起打印出来了。你可以看到，在我们的输出的结果里，进程之间的打印顺序是任意的，因为我们的代码里并没有涉及到同步的操作。&lt;/p&gt;
&lt;p&gt;我们可以在打印的内容上面那条看到脚本是如何调用 mpirun 这个程序的。mpirun 是 MPI 的实现用来启动任务的一个程序。进程会在 host 文件里指定的所有机器上面生成，MPI 程序就会在所有进程上面运行。我的脚本自定地提供了一个 &lt;em&gt;-n&lt;/em&gt; 参数告诉 MPI 程序我要运行 4 个进程。你可以试着修改脚本来使用更多进程运行 MPI 程序。当心别把你的操作系统玩崩了。:-)&lt;/p&gt;
&lt;p&gt;你可能会问，&lt;em&gt;“我的节点都都是双核的机器，我怎么样可以让 MPI 先在每个节点上的每个核上生成进程，再去其他的机器？”&lt;/em&gt; 其实方案很简单。修改一下你的 host 文件，在每个节点名字的后面加一个冒号和每个处理器有的核数就行了。比如，我在 host 文件里指定我的每个节点有2个核。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; cat host_file
cetus1:2
cetus2:2
cetus3:2
cetus4:2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当我再次运行我的脚本，&lt;em&gt;哇!&lt;/em&gt;，MPI 任务只在我的两个节点上生成了4个进程。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; ./run.py mpi_hello_world
/home/kendall/bin/mpirun -n 4 -f host_file ./mpi_hello_world
Hello world from processor cetus1, rank 0 out of 4 processors
Hello world from processor cetus2, rank 2 out of 4 processors
Hello world from processor cetus2, rank 3 out of 4 processors
Hello world from processor cetus1, rank 1 out of 4 processors
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、进阶MPI编程&lt;/h2&gt;
&lt;h3&gt;3.1、MPI初始化&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#include &quot;mpi.h&quot;
#include &amp;lt;stdio.h&amp;gt;
int main(int argc, char* argv[])
{
//=========================================================
//  MPI Indix
//  =======================================================
    int myid,numprocs,namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    // Basic MPI
    MPI_Init(&amp;amp;argc,&amp;amp;argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&amp;amp;myid);               // rank id
    MPI_Comm_size(MPI_COMM_WORLD,&amp;amp;numprocs);           // total rank
    MPI_Get_processor_name(processor_name,&amp;amp;namelen);   // get the meachine name
    if(myid==0)
        printf(&quot;Number of MPI thread is %d\n&quot;,numprocs);
    MPI_Finalize();
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这段代码里，有几句比较重要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MPI_Init(NULL, NULL)&lt;/code&gt; 在这一句之前，所有的进程都是完全相互独立的。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MPI_COMM_WORLD&lt;/code&gt; 是预定义好的通信器 (Communicator)，通信器是一个包含了进程的集合，同一个通信器里面的进程可以相互通信。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;world_rank)&lt;/code&gt; 获取每个进程的在通信器里面的 Rank，也就是编号&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MPI_Finalize()&lt;/code&gt; 这一句释放掉所有被 MPI 占用的资源。&lt;/li&gt;
&lt;li&gt;实际上 MPICC 的后端还是 GCC。MPICC 只是添加了动态链接库。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2、进程间通讯&lt;/h3&gt;
&lt;h4&gt;3.2.1、P2P 接收与发送&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;MPI_Send&lt;/code&gt; 用来发送信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;MPI_Recv&lt;/code&gt; 用来接收信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;参数说明&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;buf&lt;/code&gt; 内存地址，用于接收/发送消息的存储。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;count&lt;/code&gt; 传送消息的数量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;datatype&lt;/code&gt; 传输数据类型，除了 C 自带的类型以外，MPI 还定义了一些类型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dest&lt;/code&gt; 接收节点&lt;/li&gt;
&lt;li&gt;&lt;code&gt;source&lt;/code&gt; 发送节点&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tag&lt;/code&gt; 信息的标签&lt;/li&gt;
&lt;li&gt;&lt;code&gt;comm&lt;/code&gt; 通信器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt; 接收消息的状态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传递信息可以看作是一个 Message Envelope.每个 Send 要确保有对应的 Recv。除此以外，还要注意死锁问题，每个 Recv 都能即使获取到发送的东西。&lt;/p&gt;
&lt;p&gt;值得一提的是，接收消息的长度跟发送消息的长度是可以不同的，但是最好保证接收消息的长度 &lt;strong&gt;大于等于&lt;/strong&gt; 发送的长度，以免溢出。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;mpi.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main(int argc, char *argv[]) {
    MPI_Init(&amp;amp;argc, &amp;amp;argv);
    int numP, myId;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;myId);
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;numP);

    if(numP % 2 != 0) {
        if(!myId) {
            printf(&quot;ERROR: the number of ping-pong processors must be even number!\n&quot;);
        }
        MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
    }

    int partner_id;
    int odd = myId &amp;amp; 1;

    if(odd) {
        partner_id = myId - 1;
    } else {
        partner_id = myId + 1;
    }

    int a, b;
    if(odd == 0) {
        a = -1;
        printf(&quot;Process %d sends token %d to process %d\n&quot;, myId, a, partner_id);
        MPI_Send(&amp;amp;a, 1, MPI_INT, partner_id, 0, MPI_COMM_WORLD);

        MPI_Recv(&amp;amp;b, 1, MPI_INT, partner_id, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf(&quot;Process %d receives token %d from process %d\n&quot;, myId, b, partner_id);
    } else {
        a = 1;
        MPI_Recv(&amp;amp;b, 1, MPI_INT, partner_id, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf(&quot;Process %d receives token %d from process %d\n&quot;, myId, b, partner_id);

        printf(&quot;Process %d sends token %d to process %d\n&quot;, myId, a, partner_id);
        MPI_Send(&amp;amp;a, 1, MPI_INT, partner_id, 0, MPI_COMM_WORLD);
    }

    MPI_Finalize();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Result&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Process 2 sends token -1 to process 3
Process 0 sends token -1 to process 1
Process 1 receives token -1 from process 0
Process 1 sends token 1 to process 0
Process 0 receives token 1 from process 1
Process 3 receives token -l from process 2
Process 3 sends token 1 to process 2
Process 2 receives token 1 from process 3
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.2.2 阻塞通信与非阻塞通信&lt;/h4&gt;
&lt;p&gt;刚才说的是阻塞通信，在发送出去/接收到之前，程序会停止运行。相对的，也存在非阻塞通信。如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;MPI_ISend&lt;/code&gt; 用来发送信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;MPI_IRecv&lt;/code&gt; 用来接收信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int MPI_ISend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request);
int MPI_IRecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;request&lt;/code&gt; 用于标记通信任务。在使用非阻塞通信传来的数据之前，需要使用 &lt;code&gt;MPI_Wait&lt;/code&gt; 确认是否数据已经传入缓冲区。&lt;/p&gt;
&lt;p&gt;非阻塞通信还有如下的控制与测试函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MPI_Cancel&lt;/code&gt; 用于取消非阻塞通信。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MPI_Test&lt;/code&gt; 用于测试非阻塞通信是否已经结束。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MPI_Wait&lt;/code&gt; 用于等待非阻塞通信数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;mpi.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main(int argc, char *argv[]) {
    MPI_Init(&amp;amp;argc, &amp;amp;argv);
    int numP, myId;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;myId);
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;numP);

    int next_id = (myId + 1) % numP, prev_id = (myId - 1 + numP) % numP;
    MPI_Request rq_send, rq_recv;

    int a = 1, b;
    MPI_Isend(&amp;amp;a, 1, MPI_INT, next_id, 0, MPI_COMM_WORLD, &amp;amp;rq_send);
    MPI_Irecv(&amp;amp;b, 1, MPI_INT, prev_id, 0, MPI_COMM_WORLD, &amp;amp;rq_recv);
    MPI_Wait(&amp;amp;rq_recv, MPI_STATUS_IGNORE);
    printf(&quot;%d receive token %d from %d\n&quot; myId, b, prev_id);
    MPI_Barrier(MPI_COMM_WORLD);

    a = -1;
    MPI_Isend(&amp;amp;a, 1, MPI_INT, prev_id, 0, MPI_COMM_WORLD, &amp;amp;rq_send);
    MPI_Irecv(&amp;amp;b, 1, MPI_INT, next_id, 0, MPI_COMM_WORLD, &amp;amp;rq_recv);
    MPI_Wait(&amp;amp;rq_recv, MPI_STATUS_IGNORE);
    printf(&quot;%d receive token %d from %d\n&quot; myId, b, next_id);
    MPI_Barrier(MPI_COMM_WORLD);

    MPI_Finalize();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;5 receive token 1 from 4
6 receive token 1 from 5
4 receive token 1 from 3
1 receive token 1 from 0
0 receive token 1 from 6
2 receive token 1 from 1
3 receive token 1 from 2
1 receive token -1 from 2
4 receive token -1 from 5
0 receive token -1 from 1
6 receive token -1 from 0
5 receive token -1 from 6
3 receive token -1 from 4
2 receive token -1 from 3
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.2.3 聚合通信 (Collective Communication)&lt;/h4&gt;
&lt;p&gt;除了点对点通信之外，MPI 还有其他的通信方式如图所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./MPI%E5%B9%B6%E8%A1%8C%E6%8C%87%E5%8D%97.assets/collective-comm.png&quot; alt=&quot;Image 2&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;mpi.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main(int argc, char *argv[]) {
    MPI_Init(&amp;amp;argc, &amp;amp;argv);
    int numP, myId;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;myId);
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;numP);

    int n = atoi(argv[1])
    MPI_Barrier(MPI_COMM_WORLD);

    double start = MPI_Wtime();

    int myCount = 0;
    int total;
    int prime;

    for(int i = 2 + myId; i &amp;lt;= n; i += numP) {
        prime = 1;
        for(int j = 2; j &amp;lt; i; ++j) {
            if(i % j == 0) {
                prime = 0;
                break;
            }
        }
        myCount += prime;
    }

    MPI_Reduce(&amp;amp;myCount, &amp;amp;total, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

    double end = MPI_Wtime();
    if(!myId) {
        printf(&quot;%d primes between 1 and %d\n&quot;, total, n);
        printf(&quot;Time with %d processes: %.3lf seconds\n&quot;, numP, end - start);
    }
    MPI_Finalize();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MPI_Reduce 中有预定义好的 MPI_Ops 例如 MPI_MAX, MPI_SUM 等等。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mpirun -np 10 ./prime 100000&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;9592 primes between 1 and 100000
Time with 10 processes: 0.265 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;mpirun -np 1 ./prime 100000&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;9592 primes between 1 and 100000
Time with 1 processes: 1.012 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./MPI%E5%B9%B6%E8%A1%8C%E6%8C%87%E5%8D%97.assets/image-20240611154152399.png&quot; alt=&quot;image-20240611154152399&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】 https://mpitutorial.com/tutorials/mpi-hello-world/zh_cn/&lt;/p&gt;
&lt;p&gt;【2】&lt;a href=&quot;https://mpitutorial.com/tutorials/mpi-hello-world/zh_cn/&quot;&gt;MPI Hello World · MPI Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;【3】&lt;a href=&quot;https://cndaqiang.github.io/2019/02/27/mpi-fortran/&quot;&gt;MPI编程入门(Fortran) (cndaqiang.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;【4】&lt;a href=&quot;https://www.cnblogs.com/zhangyazhou/p/13376262.html&quot;&gt;cnblogs.com/zhangyazhou/p/13376262.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;【5】https://jinbridger.github.io/docs/hpc/openmpi-programming-101/&lt;/p&gt;
</content:encoded></item><item><title>C和C++混编以及extern的用法</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/cc%E6%B7%B7%E7%BC%96%E4%BB%A5%E5%8F%8Aextern%E7%94%A8%E6%B3%95/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/cc%E6%B7%B7%E7%BC%96%E4%BB%A5%E5%8F%8Aextern%E7%94%A8%E6%B3%95/</guid><pubDate>Mon, 12 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;C和C++混编以及extern的用法&lt;/h2&gt;
&lt;h2&gt;一. extern关键字&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;extern&lt;/code&gt;关键字的用法很简单，就是简简单单的声明，它可以明确的指出一个语句是声明；
比如&lt;code&gt;extern int i&lt;/code&gt;;那么就说明 这是声明变量 i,而不是定义i,&lt;strong&gt;声明是不开辟内存的，定义是开辟内存的&lt;/strong&gt;。
假如&lt;code&gt;int i&lt;/code&gt;；没有&lt;code&gt;extern&lt;/code&gt;修饰，那就说明为定义，会分配内存空间的。&lt;/p&gt;
&lt;h3&gt;extern 的使用场景1&lt;/h3&gt;
&lt;p&gt;extern 可以声明一个变量，使得该变量是来自其他文件的变量在本文件可以被访问。&lt;/p&gt;
&lt;p&gt;比如：创建两个文件 test.c 和 main.c文件；
在test.c文件中定义一个全局变量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//test.c
int i = 20; //定义一个全局变量
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在main.c文件，声明变量 i;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main.c文件
# include&amp;lt;stdio.h&amp;gt;
extern int i; //声明变量i，当编译链接时候，main.c文件就可以访问到test.c文件的i的值了；
int main()
{
    printf(&quot;%d&quot;,i);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样我们就可以跨文件（test.c），在本文件（main.c）访问这个变量了；&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;extern 的使用场景2&lt;/h3&gt;
&lt;p&gt;但是上诉的使用方式并不好，假如我一个大工程，这个工程由超级多的文件，这些文件假如都要访问
&lt;code&gt;test.c&lt;/code&gt;文件的 变量 i,那么，只能在这些文件中，每个文件的开头都 声明变量 i,并且，假如我的&lt;code&gt;test.c&lt;/code&gt;，不止一个定义一个变量i,有好多其他变量呢？在其他文件访问时候，都要声明好多变量，&lt;strong&gt;这会使得书写难度很繁琐，并且维护成本也大&lt;/strong&gt;；&lt;/p&gt;
&lt;p&gt;所以一般，我们都把&lt;strong&gt;声明语句放到头文件使用&lt;/strong&gt;，即我定义一个&lt;code&gt;test.h&lt;/code&gt;的头文件；
在该头文件中，声明 &lt;code&gt;extern int i&lt;/code&gt;；
然后，假如你在其他文件要使用改变量i,直接包含该头文件即可，
比如：test.h 头文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//test.h 头文件
extern int i;
extern int j;
extern int k;
//...
//声明很多很多变量
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其他.c文件，只要包含该头文件，就可以啦，比如在&lt;code&gt;main.c&lt;/code&gt;文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# include&amp;lt;stdio.h&amp;gt;
# include&quot;test.h&quot;
//extern int i; 不用写了
//extern int j;不用写了
//extern int k;不用写了
//...
//声明很多很多变量,都不用写了，因为包含了头文件，声明都在头文件中
int main()
{
    printf(&quot;%d %d %d&quot;,i,j,k);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;extern的用法总结&lt;/h3&gt;
&lt;p&gt;extern一般用于声明，在.h文件中，声明变量或者函数（函数可以不加extern，但是最好加上，这样比较统一）；在其他文件要访问该变量函数时候，包含头文件就行哦。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二. extern “C” 的理解和用法&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;在C++中，&lt;code&gt;extern&quot;C&quot;&lt;/code&gt;修饰的语句是按照C语言的方式进行编译的&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;怎么理解这句话呢？&lt;/p&gt;
&lt;p&gt;我来举几个例子：（理解它&lt;code&gt;extern&quot;C&quot;&lt;/code&gt;的含义）
我们知道在C++中函数是可以发生重载的，即编译的时候并不会报错,在C语言中，是没有重载的说法的;那么假如我用&lt;code&gt;extern&quot;C&quot;&lt;/code&gt;去修饰重载的函数的话，即在编译时候，就会按照C语言的方式去编译了：
这个时候，就会发生错误；
看例子：创建一个main.cpp文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# include&amp;lt;iostream&amp;gt;
using namespace std;

extern &quot;C&quot; void func() //用 extern&quot;C&quot;修饰
{
}
extern &quot;C&quot; void func(int v)//用 extern&quot;C&quot;修饰
{
}

int main()
{
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看下面的报错信息，不允许重载啊，本来我C++文件就是可以重载的，但是&lt;strong&gt;用extern“C”修饰过后，就不可重载函数了，这就是按照C的编译方式编译&lt;/strong&gt;，假如按C++编译方式编译那就是能通过的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./CC++%E6%B7%B7%E7%BC%96%E4%BB%A5%E5%8F%8Aextern%E7%94%A8%E6%B3%95.assets/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ZGL5ZaD5ZCW,size_20,color_FFFFFF,t_70,g_se,x_16.png&quot; alt=&quot;Image 2: 在这里插入图片描述&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;code&gt;extern&quot;C&quot; &lt;/code&gt;也是可以修饰声明函数的，也说明该函数时&lt;strong&gt;按照C语言的方式编译&lt;/strong&gt;；&lt;/p&gt;
&lt;p&gt;看看下面的例子：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# include&amp;lt;iostream&amp;gt;
using namespace std;

extern &quot;C&quot; void func() //用 extern&quot;C&quot;修饰
{
}
 void func(int v) //这个不用extern“C”声明
 {
 }
int main()
{
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的情况&lt;strong&gt;不会报错&lt;/strong&gt;，原因很简单：&lt;code&gt;extern &quot;C&quot; void func() { }&lt;/code&gt;按C语言方式编译，这个不会错；&lt;code&gt;void func(int v){ }&lt;/code&gt;按C++方式编译，所以也不会报错，这两者虽然函数名字相同，但是他们时按照不同的编译方式编译的，所以不报错；&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;extern&quot;C &quot;使用 在C与C++混合开发中的使用方式&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;通常在C++ 中，假如需要使用C语言中的库文件的话，可以使用&lt;code&gt;extern &quot;C&quot;&lt;/code&gt;去包含&lt;/strong&gt;；&lt;/p&gt;
&lt;p&gt;那如何使用呢？接下来我一步一步带你理解如何使用，先举几个例子。&lt;/p&gt;
&lt;p&gt;比如：创建math.c（C文件）中，有一些函数是数学的加法和减法功能函数。
我想在main.cpp文件中使用math.c文件中的函数，如何使用呢？
第一种办法：&lt;strong&gt;在main.cpp文件用extern&quot;C&quot;包含math.c文件中的你想用的函数。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//math.c文件

int add (int x,int y)//加法
{
    return x+y;
}
int sub(int x,int y)//减法
{
    return x-y;
}
int mult(int x,int y)//乘法
{
    return x*y;
}
int div(int x,int y) //除法
{
    return x/y;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;main.cpp（C++文件）中，要使用math.c文件中的函数.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//main.cpp文件
#include&amp;lt;iostream&amp;gt;
using namespace std;
extern “C” //用extern“C”{ }声明math.c文件中的函数，以至于可以在main.cpp文件使用。
{
    int add (int x,int y);
    int sub(int x,int y);
}

int main()
{
    cout&amp;lt;&amp;lt;add(10,20)&amp;lt;&amp;lt;endl; //由于有声明该函数，所以访问成功，结果30
    cout&amp;lt;&amp;lt;sub(10,20)&amp;lt;&amp;lt;endl;//由于有声明该函数，所以访问成功，结果-10
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;第二种使用方式：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假如我有一个需求，我想在main.cpp文件，用math.c文件中的其他函数，比如除法函数，乘法函数；
那么我就只能在 main.cpp 中 extern&quot;C&quot;{ }的括号中，逐个的加上这两个函数；这好像也可以正常使用没问题，但是，&lt;strong&gt;这很麻烦啊，别人使用你的.c库时候会先得非常麻烦&lt;/strong&gt;。所以我们一般&lt;strong&gt;使用头文件的方式，即创建多一个头文件math.h，在math.h里声明函数，在math.c文件定义函数，在main.cpp，即要使用该库文件里面，用extern&quot;C&quot;{ } ,在括号里包含该math.h头文件即可&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;看下math.h头文件内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// math.h文件的内容
int add (int x,int y);//加法
int sub(int x,int y);//减法
int mult(int x,int y);//乘法
int div(int x,int y); //除法
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在math.c中定义函数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//math.c文件

int add (int x,int y)//加法
{
    return x+y;
}
int sub(int x,int y)//减法
{
    return x-y;
}
int mult(int x,int y)//乘法
{
    return x*y;
}
int div(int x,int y) //除法
{
    return x/y;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时候我们只要在main.cpp文件中，用extern “C”{ }包含该头文件就可以使用了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//main.cpp文件
#include&amp;lt;iostream&amp;gt;
using namespace std;

extern&quot;C&quot;{ //包含头文件，该里面是C语言方式编译的。
    # include&quot;math.h&quot;
}

int main()
{
    cout&amp;lt;&amp;lt;add(10,20)&amp;lt;&amp;lt;endl; //由于有声明该函数，所以访问成功，结果30
    cout&amp;lt;&amp;lt;sub(10,20)&amp;lt;&amp;lt;endl;//由于有声明该函数，所以访问成功，结果-10
    cout&amp;lt;&amp;lt;mutl(10,20)&amp;lt;&amp;lt;endl;
    cout&amp;lt;&amp;lt;div(10,20)&amp;lt;&amp;lt;endl;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就可以正常使用了。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;但是，上面的使用方式还是不太好，该方式还是有一定的问题，什么问题呢？&lt;strong&gt;就是我在main.cpp文件使用&lt;code&gt;extern &quot;C&quot;{ #include&quot;math.h&quot;}&lt;/code&gt; ,即要多写一个 &lt;code&gt;extern&quot;C&quot;{ }&lt;/code&gt;,显得格外麻烦，再说了，假如还有其他Cpp文件要用这个C语言的库呢。都是这种方式，&lt;code&gt;extern&quot;C&quot;&lt;/code&gt;太麻烦啦&lt;/strong&gt; 。我们之前都是直接&lt;code&gt;#include&quot;math.h&quot;&lt;/code&gt;,这样才是我们平时的使用习惯呢。&lt;/p&gt;
&lt;p&gt;所以有了这&lt;strong&gt;第三种使用方式&lt;/strong&gt;：（&lt;strong&gt;为的是直接在main.cpp中，#include&quot;math.h&quot;就可以使用，不用多谢extern&quot;C&quot;）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直接在&lt;code&gt;math.h&lt;/code&gt;中，用&lt;code&gt;extern&quot;C&quot;&lt;/code&gt;的方式修饰就行啦。那么我就可以在&lt;code&gt;main.cpp&lt;/code&gt;直接&lt;code&gt;#include&quot;math.h&quot;&lt;/code&gt;。
(代码就不写啦，文字可以理解就行)&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;上面的使用有并不是完全好的方式，如何说呢？假如我有一个&lt;code&gt;.c&lt;/code&gt;文件，创建为&lt;code&gt;other.c&lt;/code&gt;，我这个文件呢，也想使用&lt;code&gt;math.c&lt;/code&gt;的函数，那么我就可以在&lt;code&gt;other.c&lt;/code&gt;文件直接包含该&lt;code&gt;math.c&lt;/code&gt;文件就可以了，可是事实却不如所想，这样会报错，报错的原因是，由于在&lt;code&gt;math.h&lt;/code&gt;文件中，声明函数用了&lt;code&gt;extern&quot;C&quot;&lt;/code&gt;，而other.c文件&lt;code&gt;# include&quot;math.h&quot;&lt;/code&gt;，会包含里面的所有内容，包括里面的 &lt;code&gt;extern&quot;C&quot;&lt;/code&gt;, &lt;strong&gt;这个&lt;code&gt;extern&quot;C&quot;&lt;/code&gt;在&lt;code&gt;other.c&lt;/code&gt;文件，即C语言文件是不认识&lt;code&gt;extern&quot;C&quot;&lt;/code&gt;啊,所以会报错&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下面展示&lt;strong&gt;报错的代码&lt;/strong&gt;，创建&lt;code&gt;other.c&lt;/code&gt;文件（C文件），里面包含&lt;code&gt;math.h&lt;/code&gt;文件(该文件有&lt;code&gt;extern&quot;C&quot;{ }&lt;/code&gt;声明方式 )&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//other.c文件
# include&quot;math.h&quot;
//包含头文件，由于这是.c文件，不是.cpp文件。所以.c文件不认识extern&quot;C&quot;,所以会报错

void test()
{
    int ret = add(10,20);//报错，不认识，add.
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;所以如何解决上面问题呢？ 核心问题是，我希望有一种使用 extern&quot;C&quot;的方式，在C语言文件中，能够使用该库，在C++文件中也可以使用该库。&lt;/p&gt;
&lt;p&gt;要解决这个问题：
也是 &lt;strong&gt;第四种使用方式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于编译器默认会在，&lt;strong&gt;你创建的任何一个.cpp文件中，默认定义一个宏 &lt;code&gt;#define __cplusplus&lt;/code&gt;,这个宏是你看不到的，是编译器默认给每个.cpp文件创建的，而在.c文件，即C语言的编译器，是没有这个宏的&lt;/strong&gt;，所以我们可以借助它，来在 math.h文件中使用下面的代码：&lt;/p&gt;
&lt;p&gt;看math.h的代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// math.h文件的内容

//意思是如果使用该头文件math.h的文件定义了__cplusplus，
//则下面代码到#endif都是有效的,在这里是 extern &quot;C&quot; { 有效
#ifdef __cplusplus
extern &quot;C&quot; {
#endif  //__cplusplus

int add (int x,int y);//加法
int sub(int x,int y);//减法
int mult(int x,int y);//乘法
int div(int x,int y); //除法

//意思是如果使用该头文件math.h的文件定义了__cplusplus，
//则下面代码到#endif都是有效的,在这里是 } 有效
#ifdef __cplusplus
}
#endif  //__cplusplus
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在main.cpp文件你直接包含该头文件math.h就可以使用了；
在other.c文件中你直接包含该头文件math.h就可以使用了；&lt;/p&gt;
&lt;p&gt;只要按上面的方式书写，那么就可以完美的解决了在C文件和C++文件中混用的问题；你既可以在.c文件使用该头文件，也可以在.cpp文件中使用该文件库。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四种方式是最值得推荐的。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三. 总结&lt;/h2&gt;
&lt;p&gt;两者 extern 和 extern&quot;C&quot;有点区别：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;extren 在C和C++中，都表示声明语句的意思；&lt;/li&gt;
&lt;li&gt;而 extern&quot;C&quot;是按C语言方式去编译文件；&lt;/li&gt;
&lt;li&gt;extern&quot;C&quot;只能在C++文件使用，extern在C和C++都可以使用；&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;https://blog.csdn.net/m0_46606290/article/details/119973574&lt;/p&gt;
</content:encoded></item><item><title>动态库、静态库编译、打包</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/%E5%8A%A8%E6%80%81%E5%BA%93%E9%9D%99%E6%80%81%E5%BA%93%E7%9A%84%E5%88%B6%E4%BD%9C/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/%E5%8A%A8%E6%80%81%E5%BA%93%E9%9D%99%E6%80%81%E5%BA%93%E7%9A%84%E5%88%B6%E4%BD%9C/</guid><pubDate>Tue, 12 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;动态库、静态库编译、打包&lt;/h1&gt;
&lt;h2&gt;1、头文件守卫&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;防止头文件被重复包含&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#ifndef _HEAD_H_
#define _HEAD_H_
......
#endif
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、静态库的制作打包&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将 .c 生成 .o 文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;gcc -c add.c -o add.o
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用 ar 工具制作静态库&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ar rcs lib库名.a add.o sub.o div.o
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;编译静态库到可执行文件中：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;gcc test.c lib库名.a -o a.out
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​    4. 如果您的库依赖于其他静态库，您需要在这一步之前将所有依赖的库合并到您的库中。这可以通过使用 &lt;code&gt;ld&lt;/code&gt; 工具的 &lt;code&gt;--whole-archive&lt;/code&gt; 选项来实现，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc -static -Wl,--whole-archive libdependency.a -Wl,--no-whole-archive -o libyourlibrary.a yourlibrary.o
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​		这个命令会将 &lt;code&gt;libdependency.a&lt;/code&gt; 中的所有对象文件与 &lt;code&gt;yourlibrary.o&lt;/code&gt; 合并成一个静态&lt;code&gt;libyourlibrary.a&lt;/code&gt;。&lt;strong&gt;打包共享&lt;/strong&gt;：将您的静态库 &lt;code&gt;libyourlibrary.a&lt;/code&gt; 以及所有相关的头文件和文档打包，确保依赖库的版权和许可信息也被包含在内。&lt;/p&gt;
&lt;p&gt;​	在GCC中使用&lt;code&gt;-Wl,--whole-archive&lt;/code&gt;选项，可以告诉链接器（通常是&lt;code&gt;ld&lt;/code&gt;）将后续的静态库中的所有对象文件都包含进最终的可执行文件中，而不是只包含被引用的对象文件。这在创建包含多个库的静态链接的可执行文件时非常有用。例如，如果您有两个静态库&lt;code&gt;libA.a&lt;/code&gt;和&lt;code&gt;libB.a&lt;/code&gt;，并且您想要确保这两个库中的所有对象文件都被包含进最终的可执行文件中，即使&lt;code&gt;libB.a&lt;/code&gt;中的某些对象文件没有被&lt;code&gt;libA.a&lt;/code&gt;直接引用，您可以使用以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc -o my_program my_program.o -Wl,--whole-archive libA.a libB.a -Wl,--no-whole-archive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个例子中，&lt;code&gt;-Wl,--whole-archive&lt;/code&gt;选项告诉链接器包含&lt;code&gt;libA.a&lt;/code&gt;和&lt;code&gt;libB.a&lt;/code&gt;中的所有对象文件，而&lt;code&gt;-Wl,--no-whole-archive&lt;/code&gt;选项则关闭了这个行为，确保后续的库只包含被引用的对象文件。&lt;/p&gt;
&lt;p&gt;请注意，&lt;code&gt;-Wl&lt;/code&gt;选项是GCC的一个前缀，用于将后面的选项传递给链接器。因此，&lt;code&gt;-Wl,--whole-archive&lt;/code&gt;实际上是在告诉GCC将&lt;code&gt;--whole-archive&lt;/code&gt;选项传递给链接器&lt;code&gt;ld&lt;/code&gt;。同样地，&lt;code&gt;-Wl,--no-whole-archive&lt;/code&gt;告诉链接器停止&lt;code&gt;--whole-archive&lt;/code&gt;行为。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;--whole-archive&lt;/code&gt;时，需要谨慎，因为这将增加最终可执行文件的大小，并且可能会包含不必要的代码。此外，如果多个库中存在相同的符号定义，可能会导致链接时的问题。&lt;/p&gt;
&lt;h2&gt;3、动态库的制作打包&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将 .c 生成 .o 文件， （生成与位置无关的代码 -fPIC）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;gcc -c add.c -o add.o -fPIC
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用 gcc -shared 制作动态库&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;gcc -shared -o lib库名.so    add.o sub.o div.o
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;编译可执行程序时，指定所使用的动态库。 -l：指定库名(去掉lib前缀和.so后缀) -L：指定库路径。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;gcc test.c -o a.out -lmymath -L./lib
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;运行可以执行程序 ./a.out 出错！！！！&lt;/p&gt;
&lt;p&gt;&lt;code&gt; --- ldd a.out --&amp;gt; &quot;not found&quot; error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如，如果你有一个共享库位于&lt;code&gt;/usr/local/lib&lt;/code&gt;目录，并且你想要编译的程序在运行时能够找到这个库，你可以使用如下的&lt;code&gt;gcc&lt;/code&gt;命令&lt;code&gt;显示指定动态库的搜索动态库路径&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc -o my_program my_program.c -L/usr/local/lib -lmylib -Wl,-rpath,/usr/local/lib
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里，&lt;code&gt;-L/usr/local/lib&lt;/code&gt;告诉编译器在编译时到哪里查找库，而&lt;code&gt;-Wl,-rpath,/usr/local/lib&lt;/code&gt;则告诉链接器在运行时到哪里查找这个库。&lt;/p&gt;
&lt;p&gt;需要注意的是，&lt;code&gt;-rpath&lt;/code&gt;选项的用法可能因不同的系统和链接器而有所不同，上面的例子适用于使用GNU ld链接器的情况。在有些系统上，可能需要使用不同的选项或者不同的方式来指定运行时链接路径。&lt;/p&gt;
&lt;p&gt;原因：&lt;/p&gt;
&lt;p&gt;链接器：    工作于链接阶段， 工作时需要 -l 和 -L&lt;/p&gt;
&lt;p&gt;动态链接器：    工作于程序运行阶段，工作时需要提供动态库所在目录位置。&lt;/p&gt;
&lt;p&gt;解决方式：&lt;/p&gt;
&lt;p&gt;【1】 通过环境变量： &lt;code&gt;export LD_LIBRARY_PATH=动态库路径&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;./a.out 成功！！！ （临时生效， 终端重启环境变量失效）&lt;/p&gt;
&lt;p&gt;【2】 永久生效： 写入 终端配置文件。 &lt;code&gt;.bashrc&lt;/code&gt; 建议使用绝对路径。&lt;/p&gt;
&lt;p&gt;【3】 拷贝自定义动态库 到 /lib (标准C库所在目录位置)&lt;/p&gt;
&lt;p&gt;【4】 配置文件法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vi /etc/ld.so.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sudo ldconfig -v  使配置文件生效。&lt;/p&gt;
&lt;p&gt;4）./a.out 成功&lt;/p&gt;
&lt;h2&gt;4、 复杂的打包实例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;include ./Makefile.config

SRCS=$(wildcard *.c)
OBJS_static=$(patsubst %.c, %.o, $(SRCS))
OBJS_dynamic=$(patsubst %.c, %.os, $(SRCS))
install:install_static install_dynamic
        cp rsf.h $(LGLROOT)/include/
        cp librsf.a $(LGLROOT)/lib/
        cp libdrsf.so $(LGLROOT)/lib/
install_static:$(OBJS_static)
        ar rc librsf.a $^
        ranlib librsf.a

install_dynamic:$(OBJS_dynamic)
        $(CC) -o libdrsf.so  -fopenmp -shared $^ -lm -lblas -lcblas

%.os:%.c
        $(CC) -o $@ -c -g -x c  -Wall  -fopenmp -fPIC -DRSF_VERSION=&apos;&quot;4.0&quot;&apos; $&amp;lt;
%.o:%.c
        $(CC) -o $@ -c -g -x c  -Wall -fopenmp -DRSF_VERSION=&apos;&quot;4.0&quot;&apos;  $&amp;lt;

clean:
        -rm -rf *.o *.os  librsf.a libdrsf.so
realclean:clean
        -rm -rf $(LGLROOT)/include/rsf.h $(LGLROOT)/lib/librsf.a $(LGLROOT)/lib/libdrsf.so
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>磁盘DISK速率查看</title><link>https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/disk-io%E9%80%9F%E7%8E%87%E6%9F%A5%E7%9C%8B/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/linux%E7%B3%BB%E7%BB%9F/disk-io%E9%80%9F%E7%8E%87%E6%9F%A5%E7%9C%8B/</guid><pubDate>Sun, 12 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;磁盘DISK速率查看&lt;/h1&gt;
&lt;h2&gt;1、安装软件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install iotop
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2、开启另一个终端窗口，使用cp命令复制一个大文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cp -R xx  xx2   # 递归复制文件夹到
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、 查看iotop (sometimes: sudo)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./DISK%20IO%E9%80%9F%E7%8E%87%E6%9F%A5%E7%9C%8B.assets/clip_image001.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://huaweicloud.csdn.net/635644b4d3efff3090b5cf3a.html&quot;&gt;在linux终端显示cp命令复制文件时的速度_linux_叫我蔡大叔-华为云开发者联盟 (csdn.net)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Fortran 命令行参数</title><link>https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/fortran%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/gnu%E8%AF%AD%E8%A8%80/fortran%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0/</guid><pubDate>Sun, 12 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Fortran 命令行参数&lt;/h1&gt;
&lt;h2&gt;1、实例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;CALL get_command_argument(1,FN1)
CALL get_command_argument(2,FN3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用上面两行代替下面：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;!FN1=1201-201-1.rsf@&apos;
!FN3=&apos;./PML/sh0t_pml-1.rsf@&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意此处FN1，FN3 为字符串&lt;/p&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】&lt;a href=&quot;https://blog.sciencenet.cn/blog-51026-622520.html&quot;&gt;科学网—【Fortran】Fortran程序带参数运行方法总结 - 郑晖的博文 (sciencenet.cn)&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>CMake 基本用法与简单介绍</title><link>https://tuoyuangui.github.io/website/posts/typora/%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95/cmake%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95/</link><guid isPermaLink="true">https://tuoyuangui.github.io/website/posts/typora/%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95/cmake%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95/</guid><pubDate>Sun, 12 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;CMake 基本用法与简单介绍&lt;/h1&gt;
&lt;h2&gt;1、 基本介绍&lt;/h2&gt;
&lt;p&gt;CMake 是一个项目构建工具，并且是跨平台的。关于项目构建我们所熟知的还有Makefile（通过 make 命令进行项目的构建），大多是IDE软件都集成了make，比如：VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等，如果自己动手写 makefile，会发现，makefile 通常依赖于当前的编译平台，而且编写 makefile 的工作量比较大，解决依赖关系时也容易出错。&lt;/p&gt;
&lt;p&gt;而 CMake 恰好能解决上述问题， 其允许开发者指定整个工程的编译流程，在根据编译平台，&lt;code&gt;自动生成本地化的Makefile和工程文件&lt;/code&gt;，最后用户只需&lt;code&gt;make&lt;/code&gt;编译即可，所以可以把CMake看成一款自动生成 Makefile的工具，其编译流程如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./CMake.assets/image-20230309130644912.png&quot; alt=&quot;Image 1: image-20230309130644912&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;蓝色虚线表示使用&lt;code&gt;makefile&lt;/code&gt;构建项目的过程&lt;/li&gt;
&lt;li&gt;红色实线表示使用&lt;code&gt;cmake&lt;/code&gt;构建项目的过程&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;介绍完CMake的作用之后，再来总结一下它的优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨平台&lt;/li&gt;
&lt;li&gt;能够管理大型项目&lt;/li&gt;
&lt;li&gt;简化编译构建过程和编译过程&lt;/li&gt;
&lt;li&gt;可扩展：可以为 cmake 编写特定功能的模块，扩充 cmake 功能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. CMake的使用&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CMake&lt;/code&gt;支持大写、小写、混合大小写的命令。如果在编写&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件时使用的工具有对应的命令提示，那么大小写随缘即可，不要太过在意。&lt;/p&gt;
&lt;h3&gt;2.1 注释&lt;/h3&gt;
&lt;h4&gt;2.1.1 注释行&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;CMake&lt;/code&gt; 使用 &lt;code&gt;#&lt;/code&gt; 进行&lt;code&gt;行注释&lt;/code&gt;，可以放在任何位置。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0.0)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.1.2 注释块&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;CMake&lt;/code&gt; 使用 &lt;code&gt;#[[ ]]&lt;/code&gt; 形式进行&lt;code&gt;块注释&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0.0)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.1 只有源文件&lt;/h2&gt;
&lt;h3&gt;2.1.1 共处一室&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;准备工作，为了方便测试，在我本地电脑准备了这么几个测试文件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;add.c&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &quot;head.h&quot;

int add(int a, int b)
{
    return a+b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;sub.c&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &quot;head.h&quot;


int subtract(int a, int b)
{
    return a-b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;mult.c&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &quot;head.h&quot;

int multiply(int a, int b)
{
    return a*b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;div.c&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &quot;head.h&quot;

double divide(int a, int b)
{
    return (double)a/b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;head.h&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#ifndef _HEAD_H
#define _HEAD_H

int add(int a, int b);

int subtract(int a, int b);

int multiply(int a, int b);

double divide(int a, int b);
#endif
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;main.c&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &quot;head.h&quot;

int main()
{
    int a = 20;
    int b = 12;
    printf(&quot;a = %d, b = %d\n&quot;, a, b);
    printf(&quot;a + b = %d\n&quot;, add(a, b));
    printf(&quot;a - b = %d\n&quot;, subtract(a, b));
    printf(&quot;a * b = %d\n&quot;, multiply(a, b));
    printf(&quot;a / b = %f\n&quot;, divide(a, b));
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上述文件的目录结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tree
.
├── add.c
├── div.c
├── head.h
├── main.c
├── mult.c
└── sub.c
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;添加 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在上述源文件所在目录下添加一个新文件 CMakeLists.txt，文件内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(CALC)
add_executable(app add.c div.c main.c mult.c sub.c)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来依次介绍一下在 CMakeLists.txt 文件中添加的三个命令:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;cmake_minimum_required&lt;/code&gt;：指定使用的 cmake 的最低版本&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可选，非必须，如果不加可能会有警告&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;project&lt;/code&gt;：定义工程名称，并可指定工程的版本、工程描述、web主页地址、支持的语言（默认情况支持所有语言），如果不需要这些都是可以忽略的，只需要指定出工程名字即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;project(&amp;lt;PROJECT-NAME&amp;gt; [&amp;lt;language-name&amp;gt;...])
project(&amp;lt;PROJECT-NAME&amp;gt;
       [VERSION &amp;lt;major&amp;gt;[.&amp;lt;minor&amp;gt;[.&amp;lt;patch&amp;gt;[.&amp;lt;tweak&amp;gt;]]]]
       [DESCRIPTION &amp;lt;project-description-string&amp;gt;]
       [HOMEPAGE_URL &amp;lt;url-string&amp;gt;]
       [LANGUAGES &amp;lt;language-name&amp;gt;...])
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;add_executable&lt;/code&gt;：定义工程会生成一个可执行程序&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_executable(可执行程序名 源文件名称)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;这里的可执行程序名和&lt;code&gt;project&lt;/code&gt;中的项目名没有任何关系&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;源文件名可以是一个也可以是多个，如有多个可用空格或&lt;code&gt;;&lt;/code&gt;间隔&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_executable(app add.c div.c main.c mult.c sub.c)

add_executable(app add.c;div.c;main.c;mult.c;sub.c)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行&lt;code&gt;CMake&lt;/code&gt; 命令&lt;/p&gt;
&lt;p&gt;万事俱备只欠东风，将 CMakeLists.txt 文件编辑好之后，就可以执行 &lt;code&gt;cmake&lt;/code&gt;命令了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# cmake 命令原型
$ cmake CMakeLists.txt文件所在路径
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$ tree
.
├── add.c
├── CMakeLists.txt
├── div.c
├── head.h
├── main.c
├── mult.c
└── sub.c

0 directories, 7 files
robin@OS:~/Linux/3Day/calc$ cmake .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当执行&lt;code&gt;cmake&lt;/code&gt;命令之后，CMakeLists.txt 中的命令就会被执行，所以一定要注意给&lt;code&gt;cmake&lt;/code&gt; 命令指定路径的时候一定不能出错。&lt;/p&gt;
&lt;p&gt;执行命令之后，看一下源文件所在目录中是否多了一些文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tree -L 1
.
├── add.c
├── CMakeCache.txt         # new add file
├── CMakeFiles             # new add dir
├── cmake_install.cmake    # new add file
├── CMakeLists.txt
├── div.c
├── head.h
├── main.c
├── Makefile               # new add file
├── mult.c
└── sub.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以看到在对应的目录下生成了一个&lt;code&gt;makefile&lt;/code&gt;文件，此时再执行&lt;code&gt;make&lt;/code&gt;命令，就可以对项目进行构建得到所需的可执行程序了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ make
Scanning dependencies of target app
[ 16%] Building C object CMakeFiles/app.dir/add.c.o
[ 33%] Building C object CMakeFiles/app.dir/div.c.o
[ 50%] Building C object CMakeFiles/app.dir/main.c.o
[ 66%] Building C object CMakeFiles/app.dir/mult.c.o
[ 83%] Building C object CMakeFiles/app.dir/sub.c.o
[100%] Linking C executable app
[100%] Built target app

# 查看可执行程序是否已经生成
$ tree -L 1
.
├── add.c
├── app					# 生成的可执行程序
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── CMakeLists.txt
├── div.c
├── head.h
├── main.c
├── Makefile
├── mult.c
└── sub.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终可执行程序&lt;code&gt;app&lt;/code&gt;就被编译出来了（这个名字是在&lt;code&gt;CMakeLists.txt&lt;/code&gt;中指定的）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.1.2 VIP 包房&lt;/h3&gt;
&lt;p&gt;通过上面的例子可以看出，如果在&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件所在目录执行了&lt;code&gt;cmake&lt;/code&gt;命令之后就会生成一些目录和文件（&lt;code&gt;包括 makefile 文件&lt;/code&gt;），如果再基于&lt;code&gt;makefile文件&lt;/code&gt;执行&lt;code&gt;make&lt;/code&gt;命令，程序在编译过程中还会生成一些中间文件和一个可执行文件，这样会导致整个项目目录看起来很混乱，不太容易管理和维护，此时我们就可以把生成的这些与项目源码无关的文件统一放到一个对应的目录里边，比如将这个目录命名为&lt;code&gt;build&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ mkdir build
$ cd build
$ cmake ..
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/robin/Linux/build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在&lt;code&gt;cmake&lt;/code&gt;命令是在&lt;code&gt;build&lt;/code&gt;目录中执行的，但是&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件是&lt;code&gt;build&lt;/code&gt;目录的上一级目录中，所以&lt;code&gt;cmake&lt;/code&gt; 命令后指定的路径为&lt;code&gt;..&lt;/code&gt;，即当前目录的上一级目录。&lt;/p&gt;
&lt;p&gt;当命令执行完毕之后，在&lt;code&gt;build&lt;/code&gt;目录中会生成一个&lt;code&gt;makefile&lt;/code&gt;文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tree build -L 1
build
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
└── Makefile

1 directory, 3 files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就可以在&lt;code&gt;build&lt;/code&gt;目录中执行&lt;code&gt;make&lt;/code&gt;命令编译项目，生成的相关文件自然也就被存储到&lt;code&gt;build&lt;/code&gt;目录中了。这样通过&lt;code&gt;cmake&lt;/code&gt;和&lt;code&gt;make&lt;/code&gt;生成的所有文件就全部和项目源文件隔离开了，各回各家，各找各妈。&lt;/p&gt;
&lt;h2&gt;2.2 私人订制&lt;/h2&gt;
&lt;h3&gt;2.2.1 定义变量&lt;/h3&gt;
&lt;p&gt;在上面的例子中一共提供了5个源文件，假设这五个源文件需要反复被使用，每次都直接将它们的名字写出来确实是很麻烦，此时我们就需要定义一个变量，将文件名对应的字符串存储起来，在cmake里定义变量需要使用&lt;code&gt;set&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;VAR&lt;/code&gt;：变量名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VALUE&lt;/code&gt;：变量值&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;set(SRC_LIST add.c;div.c;main.c;mult.c;sub.c)
add_executable(app  ${SRC_LIST})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2.2 指定使用的C++标准&lt;/h3&gt;
&lt;p&gt;在编写C++程序的时候，可能会用到C++11、C++14、C++17、C++20等新特性，那么就需要在编译的时候在编译命令中制定出要使用哪个标准：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ *.cpp -std=c++11 -o app
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的例子中通过参数&lt;code&gt;-std=c++11&lt;/code&gt;指定出要使用c++11标准编译程序，C++标准对应有一宏叫做&lt;code&gt;DCMAKE_CXX_STANDARD&lt;/code&gt;。在CMake中想要指定C++标准有两种方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 CMakeLists.txt 中通过 set 命令指定&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_CXX_STANDARD 17)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在执行 cmake 命令的时候指定出这个宏的值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#增加-std=c++11
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
#增加-std=c++14
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=14
#增加-std=c++17
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=17
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面例子中 CMake 后的路径需要根据实际情况酌情修改。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2.3 指定输出的路径&lt;/h3&gt;
&lt;p&gt;在CMake中指定可执行程序输出的路径，也对应一个宏，叫做&lt;code&gt;EXECUTABLE_OUTPUT_PATH&lt;/code&gt;，它的值还是通过&lt;code&gt;set&lt;/code&gt;命令进行设置:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set(HOME /home/robin/Linux/Sort)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;第一行：定义一个变量用于存储一个绝对路径&lt;/li&gt;
&lt;li&gt;第二行：将拼接好的路径值设置给&lt;code&gt;EXECUTABLE_OUTPUT_PATH&lt;/code&gt;宏
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如果这个路径中的子目录不存在，会自动生成，无需自己手动创建&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于可执行程序是基于 cmake 命令生成的 makefile 文件然后再执行 make 命令得到的，所以如果此处指定可执行程序生成路径的时候使用的是相对路径 ./xxx/xxx，那么这个路径中的 ./ 对应的就是 makefile 文件所在的那个目录。&lt;/p&gt;
&lt;h2&gt;2.3 搜索文件&lt;/h2&gt;
&lt;p&gt;如果一个项目里边的源文件很多，在编写&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件的时候不可能将项目目录的各个文件一一罗列出来，这样太麻烦也不现实。所以，在CMake中为我们提供了搜索文件的命令，可以使用&lt;code&gt;aux_source_directory&lt;/code&gt;命令或者&lt;code&gt;file&lt;/code&gt;命令。&lt;/p&gt;
&lt;h3&gt;2.3.1 方式1&lt;/h3&gt;
&lt;p&gt;在 CMake 中使用&lt;code&gt;aux_source_directory&lt;/code&gt; 命令可以查找某个路径下的&lt;code&gt;所有源文件&lt;/code&gt;，命令格式为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;aux_source_directory(&amp;lt; dir &amp;gt; &amp;lt; variable &amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dir&lt;/code&gt;：要搜索的目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;variable&lt;/code&gt;：将从&lt;code&gt;dir&lt;/code&gt;目录下搜索到的源文件列表存储到该变量中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
add_executable(app  ${SRC_LIST})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3.2 方式2&lt;/h3&gt;
&lt;p&gt;如果一个项目里边的源文件很多，在编写&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件的时候不可能将项目目录的各个文件一一罗列出来，这样太麻烦了。所以，在CMake中为我们提供了搜索文件的命令，他就是&lt;code&gt;file（当然，除了搜索以外通过 file 还可以做其他事情）&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GLOB&lt;/code&gt;: 将指定目录下搜索到的满足条件的所有文件名生成一个列表，并将其存储到变量中。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GLOB_RECURSE&lt;/code&gt;：递归搜索指定目录，将搜索到的满足条件的文件名生成一个列表，并将其存储到变量中。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;搜索当前目录的src目录下所有的源文件，并存储到变量中&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CMAKE_CURRENT_SOURCE_DIR 宏表示当前访问的 CMakeLists.txt 文件所在的路径。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关于要搜索的文件路径和类型可加双引号，也可不加:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file(GLOB MAIN_HEAD &quot;${CMAKE_CURRENT_SOURCE_DIR}/src/*.h&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2.4 包含头文件&lt;/h2&gt;
&lt;p&gt;在编译项目源文件的时候，很多时候都需要将源文件对应的头文件路径指定出来，这样才能保证在编译过程中编译器能够找到这些头文件，并顺利通过编译。在CMake中设置要包含的目录也很简单，通过一个命令就可以搞定了，他就是&lt;code&gt;include_directories&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;include_directories(headpath)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;举例说明，有源文件若干，其目录结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tree
.
├── build
├── CMakeLists.txt
├── include
│   └── head.h
└── src
    ├── add.cpp
    ├── div.cpp
    ├── main.cpp
    ├── mult.cpp
    └── sub.cpp

3 directories, 7 files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件内容如下:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(CALC)
set(CMAKE_CXX_STANDARD 11)
set(HOME /home/robin/Linux/calc)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin/)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
add_executable(app  ${SRC_LIST})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中，第六行指定就是头文件的路径，&lt;code&gt;PROJECT_SOURCE_DIR&lt;/code&gt;宏对应的值就是我们在使用cmake命令时，后面紧跟的目录，一般是工程的根目录。&lt;/p&gt;
&lt;h2&gt;2.5 制作动态库或静态库&lt;/h2&gt;
&lt;p&gt;有些时候我们编写的源代码并不需要将他们编译生成可执行程序，而是生成一些静态库或动态库提供给第三方使用，下面来讲解在cmake中生成这两类库文件的方法。&lt;/p&gt;
&lt;h3&gt;2.5.1 制作静态库&lt;/h3&gt;
&lt;p&gt;在cmake中，如果要制作静态库，需要使用的命令如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_library(库名称 STATIC 源文件1 [源文件2] ...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在Linux中，静态库名字分为三部分：&lt;code&gt;lib&lt;/code&gt;+&lt;code&gt;库名字&lt;/code&gt;+&lt;code&gt;.a&lt;/code&gt;，此处只需要指定出库的名字就可以了，另外两部分在生成该文件的时候会自动填充。&lt;/p&gt;
&lt;p&gt;在Windows中虽然库名和Linux格式不同，但也只需指定出名字即可。&lt;/p&gt;
&lt;p&gt;下面有一个目录，需要将&lt;code&gt;src&lt;/code&gt;目录中的源文件编译成静态库，然后再使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.
├── build
├── CMakeLists.txt
├── include           # 头文件目录
│   └── head.h
├── main.cpp          # 用于测试的源文件
└── src               # 源文件目录
    ├── add.cpp
    ├── div.cpp
    ├── mult.cpp
    └── sub.cpp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据上面的目录结构，可以这样编写&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST &quot;${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp&quot;)
add_library(calc STATIC ${SRC_LIST})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样最终就会生成对应的静态库文件&lt;code&gt;libcalc.a&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;2.5.2 制作动态库&lt;/h3&gt;
&lt;p&gt;在cmake中，如果要制作动态库，需要使用的命令如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_library(库名称 SHARED 源文件1 [源文件2] ...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在Linux中，动态库名字分为三部分：&lt;code&gt;lib&lt;/code&gt;+&lt;code&gt;库名字&lt;/code&gt;+&lt;code&gt;.so&lt;/code&gt;，此处只需要指定出库的名字就可以了，另外两部分在生成该文件的时候会自动填充。&lt;/p&gt;
&lt;p&gt;在Windows中虽然库名和Linux格式不同，但也只需指定出名字即可。&lt;/p&gt;
&lt;p&gt;根据上面的目录结构，可以这样编写&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST &quot;${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp&quot;)
add_library(calc SHARED ${SRC_LIST})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样最终就会生成对应的动态库文件&lt;code&gt;libcalc.so&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;2.5.3 指定输出的路径&lt;/h3&gt;
&lt;h4&gt;方式1 - 适用于动态库&lt;/h4&gt;
&lt;p&gt;对于生成的库文件来说和可执行程序一样都可以指定输出路径。&lt;code&gt;由于在Linux下生成的动态库默认是有执行权限的&lt;/code&gt;，所以可以按照生成可执行程序的方式去指定它生成的目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST &quot;${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp&quot;)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_library(calc SHARED ${SRC_LIST})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于这种方式来说，其实就是通过&lt;code&gt;set&lt;/code&gt;命令给&lt;code&gt;EXECUTABLE_OUTPUT_PATH&lt;/code&gt;宏设置了一个路径，这个路径就是可执行文件生成的路径。&lt;/p&gt;
&lt;h4&gt;方式2 - 都适用&lt;/h4&gt;
&lt;p&gt;由于在Linux下生成的静态库默认不具有可执行权限，所以在指定静态库生成的路径的时候就不能使用&lt;code&gt;EXECUTABLE_OUTPUT_PATH&lt;/code&gt;宏了，而应该使用&lt;code&gt;LIBRARY_OUTPUT_PATH&lt;/code&gt;，这个宏对应静态库文件和动态库文件都适用。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST &quot;${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp&quot;)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)



add_library(calc STATIC ${SRC_LIST})
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.6 包含库文件&lt;/h2&gt;
&lt;p&gt;在编写程序的过程中，可能会用到一些系统提供的动态库或者自己制作出的动态库或者静态库文件，cmake中也为我们提供了相关的加载动态库的命令。&lt;/p&gt;
&lt;h3&gt;2.6.1 链接静态库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;src
├── add.cpp
├── div.cpp
├── main.cpp
├── mult.cpp
└── sub.cpp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在我们把上面&lt;code&gt;src&lt;/code&gt;目录中的&lt;code&gt;add.cpp、div.cpp、mult.cpp、sub.cpp&lt;/code&gt;编译成一个静态库文件&lt;code&gt;libcalc.a&lt;/code&gt;。&lt;a href=&quot;https://subingwen.cn/linux/library/#1-1-%E7%94%9F%E6%88%90%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93&quot;&gt;通过命令制作并使用静态链接库&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;测试目录结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tree
.
├── build
├── CMakeLists.txt
├── include
│   └── head.h
├── lib
│   └── libcalc.a     # 制作出的静态库的名字
└── src
    └── main.cpp

4 directories, 4 files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在cmake中，链接静态库的命令如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;link_libraries(&amp;lt;static lib&amp;gt; [&amp;lt;static lib&amp;gt;...])
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数1&lt;/strong&gt;：指定出要链接的静态库的名字
&lt;ul&gt;
&lt;li&gt;可以是全名 &lt;code&gt;libxxx.a&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;也可以是掐头（&lt;code&gt;lib&lt;/code&gt;）去尾（&lt;code&gt;.a&lt;/code&gt;）之后的名字 &lt;code&gt;xxx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数2-N&lt;/strong&gt;：要链接的其它静态库的名字&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果该静态库不是系统提供的（自己制作或者使用第三方提供的静态库）可能出现静态库找不到的情况，此时可以将静态库的路径也指定出来：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;link_directories(&amp;lt;lib path&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样，修改之后的&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件内容如下:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(CALC)

file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

include_directories(${PROJECT_SOURCE_DIR}/include)

link_directories(${PROJECT_SOURCE_DIR}/lib)

link_libraries(calc)
add_executable(app ${SRC_LIST})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加了第8行的代码，就可以根据参数指定的路径找到这个静态库了。&lt;/p&gt;
&lt;h3&gt;2.6.2 链接动态库&lt;/h3&gt;
&lt;p&gt;在程序编写过程中，除了在项目中引入静态库，好多时候也会使用一些标准的或者第三方提供的一些动态库，关于动态库的制作、使用以及在内存中的加载方式和静态库都是不同的，在此不再过多赘述，如有疑惑请参考&lt;a href=&quot;https://subingwen.cn/linux/library/&quot;&gt;Linux 静态库和动态库&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;cmake&lt;/code&gt;中链接动态库的命令如下:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;target_link_libraries(
    &amp;lt;target&amp;gt;
    &amp;lt;PRIVATE|PUBLIC|INTERFACE&amp;gt; &amp;lt;item&amp;gt;...
    [&amp;lt;PRIVATE|PUBLIC|INTERFACE&amp;gt; &amp;lt;item&amp;gt;...]...)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;target&lt;/strong&gt;：指定要加载动态库的文件的名字&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;该文件可能是一个源文件&lt;/li&gt;
&lt;li&gt;该文件可能是一个动态库文件&lt;/li&gt;
&lt;li&gt;该文件可能是一个可执行文件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PRIVATE|PUBLIC|INTERFACE&lt;/strong&gt;：动态库的访问权限，默认为&lt;code&gt;PUBLIC&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果各个动态库之间没有依赖关系，无需做任何设置，三者没有没有区别，一般无需指定，使用默认的 PUBLIC 即可。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;动态库的链接具有传递性&lt;/code&gt;，如果动态库 A 链接了动态库B、C，动态库D链接了动态库A，此时动态库D相当于也链接了动态库B、C，并可以使用动态库B、C中定义的方法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;target_link_libraries(A B C)
target_link_libraries(D A)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PUBLIC&lt;/code&gt;：在public后面的库会被Link到前面的target中，并且里面的符号也会被导出，提供给第三方使用。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PRIVATE&lt;/code&gt;：在private后面的库仅被link到前面的target中，并且终结掉，第三方不能感知你调了啥库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INTERFACE&lt;/code&gt;：在interface后面引入的库不会被链接到前面的target中，只会导出符号。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;链接系统动态库&lt;/h4&gt;
&lt;p&gt;动态库的链接和静态库是完全不同的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;静态库会在生成可执行程序的链接阶段被打包到可执行程序中，所以可执行程序启动，静态库就被加载到内存中了。&lt;/li&gt;
&lt;li&gt;动态库在生成可执行程序的链接阶段&lt;strong&gt;不会&lt;/strong&gt;被打包到可执行程序中，当可执行程序被启动并且调用了动态库中的函数的时候，动态库才会被加载到内存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，在&lt;code&gt;cmake&lt;/code&gt;中指定要链接的动态库的时候，&lt;code&gt;应该将命令写到生成了可执行文件之后：&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(TEST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

add_executable(app ${SRC_LIST})

target_link_libraries(app pthread)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;target_link_libraries(app pthread)&lt;/code&gt;中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app:&lt;/code&gt; 对应的是最终生成的可执行程序的名字&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pthread&lt;/code&gt;：这是可执行程序要加载的动态库，这个库是系统提供的线程库，全名为&lt;code&gt;libpthread.so&lt;/code&gt;，在指定的时候一般会掐头（lib）去尾（.so）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;链接第三方动态库&lt;/h4&gt;
&lt;p&gt;现在，自己生成了一个动态库，对应的目录结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tree
.
├── build
├── CMakeLists.txt
├── include
│   └── head.h            # 动态库对应的头文件
├── lib
│   └── libcalc.so        # 自己制作的动态库文件
└── main.cpp              # 测试用的源文件

3 directories, 4 files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假设在测试文件&lt;code&gt;main.cpp&lt;/code&gt;中既使用了自己制作的动态库&lt;code&gt;libcalc.so&lt;/code&gt;又使用了系统提供的线程库，此时&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件可以这样写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(TEST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/include)
add_executable(app ${SRC_LIST})
target_link_libraries(app pthread calc)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;strong&gt;第六行&lt;/strong&gt;中，&lt;code&gt;pthread、calc&lt;/code&gt;都是可执行程序&lt;code&gt;app&lt;/code&gt;要链接的动态库的名字。当可执行程序&lt;code&gt;app&lt;/code&gt;生成之后并执行该文件，会提示有如下错误信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./app
./app: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是因为可执行程序启动之后，去加载&lt;code&gt;calc&lt;/code&gt;这个动态库，但是不知道这个动态库被放到了什么位置&lt;a href=&quot;https://subingwen.cn/linux/library/#2-4-1-%E5%BA%93%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86&quot;&gt;解决动态库无法加载的问题&lt;/a&gt;，所以就加载失败了，在 CMake 中可以在生成可执行程序之前，通过命令指定出要链接的动态库的位置，指定静态库位置使用的也是这个命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;link_directories(path)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以修改之后的&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件应该是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(TEST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

include_directories(${PROJECT_SOURCE_DIR}/include)

link_directories(${PROJECT_SOURCE_DIR}/lib)

add_executable(app ${SRC_LIST})

target_link_libraries(app pthread calc)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过&lt;code&gt;link_directories&lt;/code&gt;指定了动态库的路径之后，在执行生成的可执行程序的时候，就不会出现找不到动态库的问题了。&lt;/p&gt;
&lt;p&gt;温馨提示：使用 target_link_libraries 命令就可以链接动态库，也可以链接静态库文件。&lt;/p&gt;
&lt;h2&gt;2.7 日志&lt;/h2&gt;
&lt;p&gt;在CMake中可以用用户显示一条消息，该命令的名字为&lt;code&gt;message&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] &quot;message to display&quot; ...)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(无)&lt;/code&gt; ：重要消息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STATUS&lt;/code&gt; ：非重要消息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WARNING&lt;/code&gt;：CMake 警告, 会继续执行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AUTHOR_WARNING&lt;/code&gt;：CMake 警告 (dev), 会继续执行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SEND_ERROR&lt;/code&gt;：CMake 错误, 继续执行，但是会跳过生成的步骤&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FATAL_ERROR&lt;/code&gt;：CMake 错误, 终止所有处理过程&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CMake的命令行工具会在stdout上显示&lt;code&gt;STATUS&lt;/code&gt;消息，在stderr上显示其他所有消息。CMake的GUI会在它的log区域显示所有消息。&lt;/p&gt;
&lt;p&gt;CMake警告和错误消息的文本显示使用的是一种简单的标记语言。文本没有缩进，超过长度的行会回卷，段落之间以新行做为分隔符。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;message(STATUS &quot;source path: ${PROJECT_SOURCE_DIR}&quot;)

message(WARNING &quot;source path: ${PROJECT_SOURCE_DIR}&quot;)

message(FATAL_ERROR &quot;source path: ${PROJECT_SOURCE_DIR}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.8 变量操作&lt;/h2&gt;
&lt;h3&gt;2.8.1 追加&lt;/h3&gt;
&lt;p&gt;有时候项目中的源文件并不一定都在同一个目录中，但是这些源文件最终却需要一起进行编译来生成最终的可执行文件或者库文件。如果我们通过&lt;code&gt;file&lt;/code&gt;命令对各个目录下的源文件进行搜索，最后还需要做一个字符串拼接的操作，关于字符串拼接可以使用&lt;code&gt;set&lt;/code&gt;命令也可以使用&lt;code&gt;list&lt;/code&gt;命令。&lt;/p&gt;
&lt;h4&gt;使用set拼接&lt;/h4&gt;
&lt;p&gt;如果使用set进行字符串拼接，对应的命令格式如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set(变量名1 ${变量名1} ${变量名2} ...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关于上面的命令其实就是将从第二个参数开始往后所有的字符串进行拼接，最后将结果存储到第一个参数中，如果第一个参数中原来有数据会对原数据就行覆盖。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(TEST)
set(TEMP &quot;hello,world&quot;)
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
file(GLOB SRC_2 ${PROJECT_SOURCE_DIR}/src2/*.cpp)

set(SRC_1 ${SRC_1} ${SRC_2} ${TEMP})
message(STATUS &quot;message: ${SRC_1}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用list拼接&lt;/h4&gt;
&lt;p&gt;如果使用list进行字符串拼接，对应的命令格式如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;list(APPEND &amp;lt;list&amp;gt; [&amp;lt;element&amp;gt; ...])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt;命令的功能比&lt;code&gt;set&lt;/code&gt;要强大，字符串拼接只是它的其中一个功能，所以需要在它第一个参数的位置指定出我们要做的操作，&lt;code&gt;APPEND&lt;/code&gt;表示进行数据追加，后边的参数和&lt;code&gt;set&lt;/code&gt;就一样了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(TEST)
set(TEMP &quot;hello,world&quot;)
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
file(GLOB SRC_2 ${PROJECT_SOURCE_DIR}/src2/*.cpp)

list(APPEND SRC_1 ${SRC_1} ${SRC_2} ${TEMP})
message(STATUS &quot;message: ${SRC_1}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在CMake中，使用&lt;code&gt;set&lt;/code&gt;命令可以创建一个&lt;code&gt;list&lt;/code&gt;。一个在&lt;code&gt;list&lt;/code&gt;内部是一个由&lt;code&gt;分号;&lt;/code&gt;分割的一组字符串。例如，&lt;code&gt;set(var a b c d e)&lt;/code&gt;命令将会创建一个&lt;code&gt;list:a;b;c;d;e&lt;/code&gt;，但是最终打印变量值的时候得到的是&lt;code&gt;abcde&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set(tmp1 a;b;c;d;e)
set(tmp2 a b c d e)
message(${tmp1})
message(${tmp2})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出的结果:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;abcde
abcde
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.9 宏定义&lt;/h2&gt;
&lt;p&gt;在进行程序测试的时候，我们可以在代码中添加一些宏定义，通过这些宏来控制这些代码是否生效，如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define NUMBER  3

int main()
{
    int a = 10;
#ifdef DEBUG
    printf(&quot;我是一个程序猿, 我不会爬树...\n&quot;);
#endif
    for(int i=0; i&amp;lt;NUMBER; ++i)
    {
        printf(&quot;hello, GCC!!!\n&quot;);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在程序的第七行对&lt;code&gt;DEBUG&lt;/code&gt;宏进行了判断，如果该宏被定义了，那么第八行就会进行日志输出，如果没有定义这个宏，第八行就相当于被注释掉了，因此最终无法看到日志输入出（&lt;strong&gt;上述代码中并没有定义这个宏&lt;/strong&gt;）。&lt;/p&gt;
&lt;p&gt;为了让测试更灵活，我们可以不在代码中定义这个宏，而是在测试的时候去把它定义出来，其中一种方式就是在&lt;code&gt;gcc/g++&lt;/code&gt;命令中去指定，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gcc test.c -DDEBUG -o app
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;gcc/g++&lt;/code&gt;命令中通过参数 &lt;code&gt;-D&lt;/code&gt;指定出要定义的宏的名字，这样就相当于在代码中定义了一个宏，其名字为&lt;code&gt;DEBUG&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;CMake&lt;/code&gt;中我们也可以做类似的事情，对应的命令叫做&lt;code&gt;add_definitions&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_definitions(-D宏名称)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;针对于上面的源文件编写一个&lt;code&gt;CMakeLists.txt&lt;/code&gt;，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(TEST)

add_definitions(-DDEBUG)
add_executable(app ./test.c)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过这种方式，上述代码中的第八行日志就能够被输出出来了。&lt;/p&gt;
&lt;h2&gt;3. 预定义宏&lt;/h2&gt;
&lt;p&gt;下面的列表中为大家整理了一些&lt;code&gt;CMake&lt;/code&gt;中常用的宏：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;宏&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PROJECT_SOURCE_DIR&lt;/td&gt;
&lt;td&gt;使用cmake命令后紧跟的目录，一般是工程的根目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROJECT_BINARY_DIR&lt;/td&gt;
&lt;td&gt;执行cmake命令的目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMAKE_CURRENT_SOURCE_DIR&lt;/td&gt;
&lt;td&gt;当前处理的CMakeLists.txt所在的路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMAKE_CURRENT_BINARY_DIR&lt;/td&gt;
&lt;td&gt;target 编译目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXECUTABLE_OUTPUT_PATH&lt;/td&gt;
&lt;td&gt;重新定义目标二进制可执行文件的存放位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LIBRARY_OUTPUT_PATH&lt;/td&gt;
&lt;td&gt;重新定义目标链接库文件的存放位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROJECT_NAME&lt;/td&gt;
&lt;td&gt;返回通过PROJECT指令定义的项目名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMAKE_BINARY_DIR&lt;/td&gt;
&lt;td&gt;项目实际构建路径，假设在&lt;code&gt;build&lt;/code&gt;目录进行的构建，那么得到的就是这个目录的路径&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;CMake 保姆级教程（下）&lt;/h1&gt;
&lt;p&gt;如果项目很大，或者项目中有很多的源码目录，在通过CMake管理项目的时候如果只使用一个&lt;code&gt;CMakeLists.txt&lt;/code&gt;，那么这个文件相对会比较复杂，有一种化繁为简的方式就是给每个源码目录都添加一个&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件（头文件目录不需要），这样每个文件都不会太复杂，而且更灵活，更容易维护。&lt;/p&gt;
&lt;p&gt;先来看一下下面的这个的目录结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ tree
.
├── build
├── calc
│   ├── add.cpp
│   ├── CMakeLists.txt
│   ├── div.cpp
│   ├── mult.cpp
│   └── sub.cpp
├── CMakeLists.txt
├── include
│   ├── calc.h
│   └── sort.h
├── sort
│   ├── CMakeLists.txt
│   ├── insert.cpp
│   └── select.cpp
├── test1
│   ├── calc.cpp
│   └── CMakeLists.txt
└── test2
    ├── CMakeLists.txt
    └── sort.cpp

6 directories, 15 files
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;include 目录&lt;/code&gt;：头文件目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;calc 目录&lt;/code&gt;：目录中的四个源文件对应的加、减、乘、除算法
&lt;ul&gt;
&lt;li&gt;对应的头文件是&lt;code&gt;include&lt;/code&gt;中的&lt;code&gt;calc.h&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sort 目录&lt;/code&gt; ：目录中的两个源文件对应的是插入排序和选择排序算法
&lt;ul&gt;
&lt;li&gt;对应的头文件是&lt;code&gt;include&lt;/code&gt;中的&lt;code&gt;sort.h&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test1 目录&lt;/code&gt;：测试目录，对加、减、乘、除算法进行测试&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test2 目录&lt;/code&gt;：测试目录，对排序算法进行测试&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以看到各个源文件目录所需要的&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件现在已经添加完毕了。接下来庖丁解牛，我们依次分析一下各个文件中需要添加的内容。&lt;/p&gt;
&lt;h2&gt;1.1 准备工作&lt;/h2&gt;
&lt;h3&gt;1.1.1 节点关系&lt;/h3&gt;
&lt;p&gt;众所周知，Linux的目录是树状结构，所以&lt;code&gt;嵌套的 CMake 也是一个树状结构，最顶层的 CMakeLists.txt 是根节点，其次都是子节点。&lt;/code&gt;因此，我们需要了解一些关于 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 文件变量作用域的一些信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根节点&lt;code&gt;CMakeLists.txt&lt;/code&gt;中的变量全局有效&lt;/li&gt;
&lt;li&gt;父节点&lt;code&gt;CMakeLists.txt&lt;/code&gt;中的变量可以在子节点中使用&lt;/li&gt;
&lt;li&gt;子节点&lt;code&gt;CMakeLists.txt&lt;/code&gt;中的变量只能在当前节点中使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.1.2 添加子目录&lt;/h3&gt;
&lt;p&gt;接下来我们还需要知道在 CMake 中父子节点之间的关系是如何建立的，这里需要用到一个 CMake 命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;source_dir&lt;/code&gt;：指定了&lt;code&gt;CMakeLists.txt&lt;/code&gt;源文件和代码文件的位置，其实就是指定子目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;binary_dir&lt;/code&gt;：指定了输出文件的路径，一般不需要指定，忽略即可。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EXCLUDE_FROM_ALL&lt;/code&gt;：在子路径下的目标默认不会被包含到父路径的&lt;code&gt;ALL&lt;/code&gt;目标里，并且也会被排除在IDE工程文件之外。用户必须显式构建在子路径下的目标。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过这种方式&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件之间的父子关系就被构建出来了。&lt;/p&gt;
&lt;h2&gt;1.2 解决问题&lt;/h2&gt;
&lt;p&gt;在上面的目录中我们要做如下事情：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过 &lt;code&gt;test1 目录&lt;/code&gt;中的测试文件进行计算器相关的测试&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;test2 目录&lt;/code&gt;中的测试文件进行排序相关的测试&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;现在相当于是要进行模块化测试，对于&lt;code&gt;calc&lt;/code&gt;和&lt;code&gt;sort&lt;/code&gt;目录中的源文件来说，可以将它们先编译成库文件（可以是静态库也可以是动态库）然后在提供给测试文件使用即可。库文件的本质其实还是代码，只不过是从文本格式变成了二进制格式。&lt;/p&gt;
&lt;h3&gt;1.2.1 根目录&lt;/h3&gt;
&lt;p&gt;根目录中的 &lt;code&gt;CMakeLists.txt&lt;/code&gt;文件内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.0)
project(test)


set(LIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib)

set(EXEC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)

set(HEAD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include)

set(CALC_LIB calc)
set(SORT_LIB sort)

set(APP_NAME_1 test1)
set(APP_NAME_2 test2)

add_subdirectory(calc)
add_subdirectory(sort)
add_subdirectory(test1)
add_subdirectory(test2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在根节点对应的文件中主要做了两件事情：&lt;code&gt;定义全局变量&lt;/code&gt;和&lt;code&gt;添加子目录&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定义的全局变量主要是给子节点使用，目的是为了提高子节点中的&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件的可读性和可维护性，避免冗余并降低出差的概率。&lt;/li&gt;
&lt;li&gt;一共添加了四个子目录，每个子目录中都有一个&lt;code&gt;CMakeLists.txt&lt;/code&gt;文件，这样它们的父子关系就被确定下来了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 流程控制&lt;/h2&gt;
&lt;p&gt;在 CMake 的 CMakeLists.txt 中也可以进行流程控制，也就是说可以像写 shell 脚本那样进行&lt;code&gt;条件判断&lt;/code&gt;和&lt;code&gt;循环&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;2.1 条件判断&lt;/h2&gt;
&lt;p&gt;关于条件判断其语法格式如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if(&amp;lt;condition&amp;gt;)
  &amp;lt;commands&amp;gt;
elseif(&amp;lt;condition&amp;gt;)
  &amp;lt;commands&amp;gt;
else()
  &amp;lt;commands&amp;gt;
endif()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在进行条件判断的时候，如果有多个条件，那么可以写多个&lt;code&gt;elseif&lt;/code&gt;，最后一个条件可以使用&lt;code&gt;else&lt;/code&gt;，但是&lt;strong&gt;开始和结束是必须要成对出现的&lt;/strong&gt;，分别为：&lt;code&gt;if&lt;/code&gt;和&lt;code&gt;endif&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;2.1.1 基本表达式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;if(&amp;lt;expression&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是基本表达式，&lt;code&gt;expression&lt;/code&gt; 有以下三种情况：&lt;code&gt;常量&lt;/code&gt;、&lt;code&gt;变量&lt;/code&gt;、&lt;code&gt;字符串&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果是&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;ON&lt;/code&gt;, &lt;code&gt;YES&lt;/code&gt;, &lt;code&gt;TRUE&lt;/code&gt;, &lt;code&gt;Y&lt;/code&gt;, &lt;code&gt;非零值&lt;/code&gt;，&lt;code&gt;非空字符串&lt;/code&gt;时，条件判断返回&lt;code&gt;True&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果是 &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;OFF&lt;/code&gt;, &lt;code&gt;NO&lt;/code&gt;, &lt;code&gt;FALSE&lt;/code&gt;, &lt;code&gt;N&lt;/code&gt;, &lt;code&gt;IGNORE&lt;/code&gt;, &lt;code&gt;NOTFOUND&lt;/code&gt;，&lt;code&gt;空字符串&lt;/code&gt;时，条件判断返回&lt;code&gt;False&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1.2 逻辑判断&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NOT&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if(NOT &amp;lt;condition&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其实这就是一个取反操作，如果条件&lt;code&gt;condition&lt;/code&gt;为&lt;code&gt;True&lt;/code&gt;将返回&lt;code&gt;False&lt;/code&gt;，如果条件&lt;code&gt;condition&lt;/code&gt;为&lt;code&gt;False&lt;/code&gt;将返回&lt;code&gt;True&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AND&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if(&amp;lt;cond1&amp;gt; AND &amp;lt;cond2&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果&lt;code&gt;cond1&lt;/code&gt;和&lt;code&gt;cond2&lt;/code&gt;同时为&lt;code&gt;True&lt;/code&gt;，返回&lt;code&gt;True&lt;/code&gt;否则返回&lt;code&gt;False&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OR&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if(&amp;lt;cond1&amp;gt; OR &amp;lt;cond2&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果&lt;code&gt;cond1&lt;/code&gt;和&lt;code&gt;cond2&lt;/code&gt;两个条件中至少有一个为&lt;code&gt;True&lt;/code&gt;，返回&lt;code&gt;True&lt;/code&gt;，如果两个条件都为&lt;code&gt;False&lt;/code&gt;则返回&lt;code&gt;False&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2.2 循环&lt;/h2&gt;
&lt;p&gt;在 CMake 中循环有两种方式，分别是：&lt;code&gt;foreach&lt;/code&gt;和&lt;code&gt;while&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;2.2.1 foreach&lt;/h3&gt;
&lt;p&gt;使用 foreach 进行循环，语法格式如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foreach(&amp;lt;loop_var&amp;gt; &amp;lt;items&amp;gt;)
    &amp;lt;commands&amp;gt;
endforeach()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过&lt;code&gt;foreach&lt;/code&gt;我们就可以对&lt;code&gt;items&lt;/code&gt;中的数据进行遍历，然后通过&lt;code&gt;loop_var&lt;/code&gt;将遍历到的当前的值取出，在取值的时候有以下几种用法：&lt;/p&gt;
&lt;h4&gt;方法1&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;foreach(&amp;lt;loop_var&amp;gt; RANGE &amp;lt;stop&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RANGE&lt;/code&gt;：关键字，表示要遍历范围&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stop&lt;/code&gt;：这是一个&lt;code&gt;正整数，表示范围的结束值&lt;/code&gt;，在遍历的时候&lt;code&gt;从 0 开始，最大值为 stop&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loop_var&lt;/code&gt;：存储每次循环取出的值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;举例说明：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.2)
project(test)

foreach(item RANGE 10)
    message(STATUS &quot;当前遍历的值为: ${item}&quot; )
endforeach()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出的日志信息是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cmake ..
-- 当前遍历的值为: 0
-- 当前遍历的值为: 1
-- 当前遍历的值为: 2
-- 当前遍历的值为: 3
-- 当前遍历的值为: 4
-- 当前遍历的值为: 5
-- 当前遍历的值为: 6
-- 当前遍历的值为: 7
-- 当前遍历的值为: 8
-- 当前遍历的值为: 9
-- 当前遍历的值为: 10
-- Configuring done
-- Generating done
-- Build files have been written to: /home/robin/abc/a/build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再次强调：在对一个整数区间进行遍历的时候，得到的范围是这样的 【0，stop】，右侧是闭区间包含 stop 这个值。&lt;/p&gt;
&lt;h4&gt;方法2&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;foreach(&amp;lt;loop_var&amp;gt; RANGE &amp;lt;start&amp;gt; &amp;lt;stop&amp;gt; [&amp;lt;step&amp;gt;])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是上面&lt;code&gt;方法1&lt;/code&gt;的加强版，我们在遍历一个整数区间的时候，除了可以指定起始范围，还可以指定步长。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RANGE&lt;/code&gt;：关键字，表示要遍历范围&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start&lt;/code&gt;：这是一个&lt;code&gt;正整数，表示范围的起始值，也就是说最小值为 start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stop&lt;/code&gt;：这是一个&lt;code&gt;正整数，表示范围的结束值，也就是说最大值为 stop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;step&lt;/code&gt;：控制每次遍历的时候以怎样的步长增长，&lt;code&gt;默认为1，可以不设置&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loop_var&lt;/code&gt;：存储每次循环取出的值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;举例说明：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.2)
project(test)

foreach(item RANGE 10 30 2)
    message(STATUS &quot;当前遍历的值为: ${item}&quot; )
endforeach()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出的结果如下:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cmake ..
-- 当前遍历的值为: 10
-- 当前遍历的值为: 12
-- 当前遍历的值为: 14
-- 当前遍历的值为: 16
-- 当前遍历的值为: 18
-- 当前遍历的值为: 20
-- 当前遍历的值为: 22
-- 当前遍历的值为: 24
-- 当前遍历的值为: 26
-- 当前遍历的值为: 28
-- 当前遍历的值为: 30
-- Configuring done
-- Generating done
-- Build files have been written to: /home/robin/abc/a/build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再次强调：在使用上面的方式对一个整数区间进行遍历的时候，得到的范围是这样的 【start，stop】，左右两侧都是闭区间，包含 start 和 stop 这两个值，步长 step 默认为1，可以不设置。&lt;/p&gt;
&lt;h4&gt;方法3&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;foreach(&amp;lt;loop_var&amp;gt; IN [LISTS [&amp;lt;lists&amp;gt;]] [ITEMS [&amp;lt;items&amp;gt;]])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是&lt;code&gt;foreach&lt;/code&gt;的另一个变体，通过这种方式我们可以对更加复杂的数据进行遍历，前两种方式只适用于对某个正整数范围内的遍历。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;IN&lt;/code&gt;：关键字，表示在 xxx 里边&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;LISTS&lt;/code&gt;：关键字，对应的是列表&lt;code&gt;list&lt;/code&gt;，通过&lt;code&gt;set、list&lt;/code&gt;可以获得&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ITEMS&lt;/code&gt;：关键字，对应的也是列表&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;loop_var&lt;/code&gt;：存储每次循环取出的值&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.2)
project(test)

set(WORD a b c d)
set(NAME ace sabo luffy)

foreach(item IN LISTS WORD NAME)
    message(STATUS &quot;当前遍历的值为: ${item}&quot; )
endforeach()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的例子中，创建了两个 &lt;code&gt;list&lt;/code&gt; 列表，在遍历的时候对它们两个都进行了遍历（&lt;code&gt;可以根据实际需求选择同时遍历多个或者只遍历一个&lt;/code&gt;）。输出的日志信息如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd build/
$ cmake ..
-- 当前遍历的值为: a
-- 当前遍历的值为: b
-- 当前遍历的值为: c
-- 当前遍历的值为: d
-- 当前遍历的值为: ace
-- 当前遍历的值为: sabo
-- 当前遍历的值为: luffy
-- Configuring done
-- Generating done
-- Build files have been written to: /home/robin/abc/a/build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一共输出了7个字符串，说明遍历是没有问题的。接下来看另外一种方式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.2)
project(test)

set(WORD a b c &quot;d e f&quot;)
set(NAME ace sabo luffy)
foreach(item IN ITEMS ${WORD} ${NAME})
    message(STATUS &quot;当前遍历的值为: ${item}&quot; )
endforeach()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的例子中，遍历过程中将关键字&lt;code&gt;LISTS&lt;/code&gt;改成了&lt;code&gt;ITEMS&lt;/code&gt;，后边跟的还是一个或者多个列表，只不过此时需要通过&lt;code&gt;${}&lt;/code&gt;将列表中的值取出。其输出的信息和上一个例子是一样的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd build/
$ cmake ..
-- 当前遍历的值为: a
-- 当前遍历的值为: b
-- 当前遍历的值为: c
-- 当前遍历的值为: d e f
-- 当前遍历的值为: ace
-- 当前遍历的值为: sabo
-- 当前遍历的值为: luffy
-- Configuring done
-- Generating done
-- Build files have been written to: /home/robin/abc/a/build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;小细节：在通过 set 组织列表的时候，如果某个字符串中有空格，可以通过双引号将其包裹起来，具体的操作方法可以参考上面的例子。&lt;/p&gt;
&lt;h4&gt;方法4&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;注意事项：这种循环方式要求CMake的版本大于等于 3.17。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foreach(&amp;lt;loop_var&amp;gt;... IN ZIP_LISTS &amp;lt;lists&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过这种方式，遍历的还是一个或多个列表，可以理解为是&lt;code&gt;方式3&lt;/code&gt;的加强版。因为通过上面的方式遍历多个列表，但是又想把指定列表中的元素取出来使用是做不到的，在这个加强版中就可以轻松实现。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;loop_var&lt;/code&gt;：存储每次循环取出的值，可以根据要遍历的列表的数量指定多个变量，用于存储对应的列表当前取出的那个值。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;如果指定了多个变量名，它们的数量应该和列表的数量相等&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;如果只给出了一个 loop_var，那么它将一系列的 loop_var_N 变量来存储对应列表中的当前项，也就是说 loop_var_0 对应第一个列表，loop_var_1 对应第二个列表，以此类推......&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;如果遍历的多个列表中一个列表较短，当它遍历完成之后将不会再参与后续的遍历（因为其它列表还没有遍历完）。&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IN&lt;/code&gt;：关键字，表示在 xxx 里边&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ZIP_LISTS&lt;/code&gt;：关键字，对应的是列表&lt;code&gt;list&lt;/code&gt;，通过&lt;code&gt;set 、list&lt;/code&gt;可以获得&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.17)
project(test)

list(APPEND WORD hello world &quot;hello world&quot;)
list(APPEND NAME ace sabo luffy zoro sanji)

foreach(item1 item2 IN ZIP_LISTS WORD NAME)
    message(STATUS &quot;当前遍历的值为: item1 = ${item1}, item2=${item2}&quot; )
endforeach()

message(&quot;=============================&quot;)

foreach(item  IN ZIP_LISTS WORD NAME)
    message(STATUS &quot;当前遍历的值为: item1 = ${item_0}, item2=${item_1}&quot; )
endforeach()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个例子中关于列表数据的添加是通过&lt;code&gt;list&lt;/code&gt;来实现的。在遍历列表的时候一共使用了两种方式，一种提供了多个变量来存储当前列表中的值，另一种只有一个变量，但是实际取值的时候需要通过&lt;code&gt;变量名_0、变量名_1、变量名_N&lt;/code&gt; 的方式来操作，注意事项：第一个列表对应的编号是0，第一个列表对应的编号是0，第一个列表对应的编号是0。&lt;/p&gt;
&lt;p&gt;上面的例子输出的结果如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd build/
$ cmake ..
-- 当前遍历的值为: item1 = hello, item2=ace
-- 当前遍历的值为: item1 = world, item2=sabo
-- 当前遍历的值为: item1 = hello world, item2=luffy
-- 当前遍历的值为: item1 = , item2=zoro
-- 当前遍历的值为: item1 = , item2=sanji
=============================
-- 当前遍历的值为: item1 = hello, item2=ace
-- 当前遍历的值为: item1 = world, item2=sabo
-- 当前遍历的值为: item1 = hello world, item2=luffy
-- 当前遍历的值为: item1 = , item2=zoro
-- 当前遍历的值为: item1 = , item2=sanji
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/robin/abc/a/build
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reference&lt;/h2&gt;
&lt;p&gt;【1】 https://subingwen.cn/cmake/CMake-advanced/&lt;/p&gt;
</content:encoded></item></channel></rss>