首页/新闻资讯/正文详情

【方法篇07】BP神经网络:C与MATLAB双实现及效能评估(附源码)

发布时间:2026/9/25 16:56:41 来源:云帆数科 栏目:资讯中心
【方法篇07】BP神经网络:C与MATLAB双实现及效能评估(附源码)
目录一、前言二、BP神经网络运行流程三、样本数据四、C语言实现4.1 核心设计思路4.2 完整代码4.3 关键实现细节五、MATLAB实现六、C与MATLAB实现对比七、模型评价与改进方向7.1 当前模型表现7.2 局限性7.3 改进建议八、总结九、勘误及更新说明一、前言在装备论证与效能评估领域常面临这样一个问题已知多个方案的若干指标参数如何预测其综合效能当指标与效能之间存在非线性关系时传统加权求和或TOPSIS等方法难以刻画复杂的映射规律。此时BPBackpropagation神经网络作为一种经典的监督学习模型能够通过样本学习输入与输出之间的非线性映射是工程实践中常用的解决方案。本文将基于同一套数据分别用C语言​ 和MATLAB​ 实现BP神经网络完成从算法原理到代码落地再到结果分析的全流程。两种实现互为验证既可用于工程嵌入C版也可用于快速验证MATLAB版。二、BP神经网络运行流程三、样本数据5个装备方案4个输入指标1个输出效能值方案探测距离反应时间命中概率成本综合效能A0.52940.17650.41181.00000.6218B0.23530.35290.17650.41180.4873C1.00000.00001.00000.00000.7125D0.00000.47060.00000.41180.8031E0.82350.64710.82350.76470.6652所有输入已标准化到[0,1]越大表示性能越好成本反向处理。四、C语言实现4.1 核心设计思路C版本面向工程嵌入设计要点所有维度用宏定义编译期确定批量训练矩阵运算展开为多层循环同时支持控制台和文件输出固定随机种子保证可复现4.2 完整代码/** * file : Alg_11_BPNN.h * brief : BP神经网络模型 * details : 基于误差反向传播的多层前馈监督学习网络用于非线性拟合与效能预测 * author : 三环上的骑士 * date : 2026-05 * version : v1.0 * note : 需监督信号如专家综合效能值进行训练 * warning : 随机初始化易陷局部极小结果存在一定波动性 */ #include stdio.h #include stdlib.h #include math.h #include time.h #define INNUM 4 // 输入维数 #define HIDNUM 6 // 隐层节点数 #define OUTNUM 1 // 输出维数 #define SAMPLE 5 // 样本数 #define EPOCHS 6000 #define LR 0.05 #define EPS 1e-8 #define RESULTPATH ../../../006_效能评估结果数据包/11_bpnn_result.txt /* 激活函数 */ static inline double sigmoid2(double x) { return 1.0 / (1.0 exp(-x)); } /* 随机数初始化Xavier */ void init_weights(double *w, int fan_in, int fan_out) { srand(2026); double limit sqrt(6.0 / (fan_in fan_out)); for (int i 0; i fan_in * fan_out; i) { w[i] ((double)rand() / RAND_MAX * 2.0 - 1.0) * limit; } } /* BP训练与预测 */ void bp_train_predict( double P[INNUM][SAMPLE], double T[SAMPLE], double W1[HIDNUM][INNUM], double b1[HIDNUM], double W2[OUTNUM][HIDNUM], double b2[OUTNUM], double Y_pred[SAMPLE], double loss_rec[EPOCHS] ) { int epoch, s, i, j; double Z1[HIDNUM][SAMPLE]; double A1[HIDNUM][SAMPLE]; double Z2[OUTNUM][SAMPLE]; double A2[OUTNUM][SAMPLE]; double E[OUTNUM][SAMPLE]; double dZ2[OUTNUM][SAMPLE]; double dW2[OUTNUM][HIDNUM]; double db2[OUTNUM]; double dA1[HIDNUM][SAMPLE]; double dZ1[HIDNUM][SAMPLE]; double dW1[HIDNUM][INNUM]; double db1[HIDNUM]; for (epoch 0; epoch EPOCHS; epoch) { /* ---------- 前向传播 ---------- */ for (s 0; s SAMPLE; s) { for (i 0; i HIDNUM; i) { Z1[i][s] b1[i]; for (j 0; j INNUM; j) Z1[i][s] W1[i][j] * P[j][s]; A1[i][s] sigmoid2(Z1[i][s]); } } for (s 0; s SAMPLE; s) { for (i 0; i OUTNUM; i) { Z2[i][s] b2[i]; for (j 0; j HIDNUM; j) Z2[i][s] W2[i][j] * A1[j][s]; A2[i][s] Z2[i][s]; // purelin } } /* ---------- 误差 ---------- */ double loss 0.0; for (s 0; s SAMPLE; s) { for (i 0; i OUTNUM; i) { E[i][s] A2[i][s] - T[s]; loss E[i][s] * E[i][s]; } } loss_rec[epoch] loss / (2.0 * SAMPLE); /* ---------- 反向传播 ---------- */ /* 输出层 */ for (s 0; s SAMPLE; s) for (i 0; i OUTNUM; i) dZ2[i][s] E[i][s]; // purelin导数1 for (i 0; i OUTNUM; i) for (j 0; j HIDNUM; j) { dW2[i][j] 0.0; for (s 0; s SAMPLE; s) dW2[i][j] dZ2[i][s] * A1[j][s]; dW2[i][j] / SAMPLE; } for (i 0; i OUTNUM; i) { db2[i] 0.0; for (s 0; s SAMPLE; s) db2[i] dZ2[i][s]; db2[i] / SAMPLE; } /* 隐层 */ for (s 0; s SAMPLE; s) for (i 0; i HIDNUM; i) { dA1[i][s] 0.0; for (j 0; j OUTNUM; j) dA1[i][s] W2[j][i] * dZ2[j][s]; dZ1[i][s] dA1[i][s] * A1[i][s] * (1.0 - A1[i][s]); } for (i 0; i HIDNUM; i) for (j 0; j INNUM; j) { dW1[i][j] 0.0; for (s 0; s SAMPLE; s) dW1[i][j] dZ1[i][s] * P[j][s]; dW1[i][j] / SAMPLE; } for (i 0; i HIDNUM; i) { db1[i] 0.0; for (s 0; s SAMPLE; s) db1[i] dZ1[i][s]; db1[i] / SAMPLE; } /* ---------- 参数更新 ---------- */ for (i 0; i OUTNUM; i) { for (j 0; j HIDNUM; j) W2[i][j] - LR * dW2[i][j]; b2[i] - LR * db2[i]; } for (i 0; i HIDNUM; i) { for (j 0; j INNUM; j) W1[i][j] - LR * dW1[i][j]; b1[i] - LR * db1[i]; } if (epoch % 500 0) printf(Epoch %4d | MSE %.6f\n, epoch, loss_rec[epoch]); } /* ---------- 预测输出 ---------- */ for (s 0; s SAMPLE; s) { double sum b2[0]; for (j 0; j HIDNUM; j) { double a1 sigmoid2(W1[j][0] * P[0][s] W1[j][1] * P[1][s] W1[j][2] * P[2][s] W1[j][3] * P[3][s] b1[j]); sum W2[0][j] * a1; } Y_pred[s] sum; } } /* BPNN 结果输出控制台 */ void print_bpnn_results( double T[SAMPLE], double Y_pred[SAMPLE], double loss_rec[EPOCHS] ) { int i; double mse 0.0, mae 0.0, rmse 0.0; double mean 0.0, var 0.0, r2 0.0; /* ---------- 1. 训练误差统计 ---------- */ for (i 0; i SAMPLE; i) mean T[i]; mean / SAMPLE; for (i 0; i SAMPLE; i) { double err Y_pred[i] - T[i]; mse err * err; mae fabs(err); var (T[i] - mean) * (T[i] - mean); } mse / SAMPLE; mae / SAMPLE; rmse sqrt(mse); r2 (var EPS) ? 0.0 : (1.0 - mse * SAMPLE / var); printf(\n BP神经网络效能评估结果 \n); printf(网络结构: %d-%d-%d (输入-隐层-输出)\n, INNUM, HIDNUM, OUTNUM); printf(训练轮数: %d, 学习率: %.4f\n\n, EPOCHS, LR); /* ---------- 2. 样本预测明细 ---------- */ printf(---------- 1. 样本预测明细 ----------\n); printf(%-8s %10s %10s %12s %12s\n, 方案, 真实值, 预测值, 绝对误差, 相对误差); const char *labels[SAMPLE] { A, B, C, D, E }; for (i 0; i SAMPLE; i) { double abs_err fabs(Y_pred[i] - T[i]); double rel_err (T[i] ! 0.0) ? abs_err / T[i] : 0.0; printf(%-8s %10.4f %10.4f %12.4f %11.2f%%\n, labels[i], T[i], Y_pred[i], abs_err, rel_err * 100.0); } printf(\n); /* ---------- 3. 模型性能指标 ---------- */ printf(---------- 2. 模型性能指标 ----------\n); printf(MSE %.6f\n, mse); printf(RMSE %.6f\n, rmse); printf(MAE %.6f\n, mae); printf(R² %.6f\n, r2); printf(\n); /* ---------- 4. 训练收敛情况 ---------- */ printf(---------- 3. 训练收敛情况 ----------\n); printf(初始损失: %.6f\n, loss_rec[0]); printf(最终损失: %.6f\n, loss_rec[EPOCHS - 1]); printf(损失下降: %.6f\n, loss_rec[0] - loss_rec[EPOCHS - 1]); /* ---------- 5. 模型评价结论 ---------- */ printf(\n---------- 4. 模型评价结论 ----------\n); if (r2 0.95) printf(✅ 模型拟合优度优秀 (R² 0.95)\n); else if (r2 0.85) printf(✅ 模型拟合优度良好 (R² 0.85)\n); else if (r2 0.70) printf(⚠️ 模型拟合一般建议增加样本或调整结构\n); else printf(❌ 模型拟合较差需重新设计网络或检查数据\n); if (rmse 0.05) printf(✅ 预测精度满足工程需求 (RMSE 0.05)\n); else printf(⚠️ 预测误差偏大建议延长训练或调整学习率\n); printf(\n); } /* BPNN 结果输出文件版 */ /* BP 神经网络结果输出文件版 */ void print_bpnn_results_to_file( double T[SAMPLE], double Y_pred[SAMPLE], double loss_rec[EPOCHS], FILE *fp ) { int i; double mse 0.0, mae 0.0, rmse 0.0; double mean 0.0, var 0.0, r2 0.0; /* ---------- 1. 统计指标计算 ---------- */ for (i 0; i SAMPLE; i) mean T[i]; mean / SAMPLE; for (i 0; i SAMPLE; i) { double err Y_pred[i] - T[i]; mse err * err; mae fabs(err); var (T[i] - mean) * (T[i] - mean); } mse / SAMPLE; mae / SAMPLE; rmse sqrt(mse); r2 (var EPS) ? 0.0 : (1.0 - mse * SAMPLE / var); /* ---------- 2. 文件头信息 ---------- */ fprintf(fp, \n BP 神经网络效能评估结果 \n); fprintf(fp, 网络结构: %d-%d-%d\n, INNUM, HIDNUM, OUTNUM); fprintf(fp, 训练轮数: %d, 学习率: %.4f\n\n, EPOCHS, LR); /* ---------- 3. 样本预测明细 ---------- */ fprintf(fp, ---------- 1. 样本预测明细 ----------\n); fprintf(fp, %-8s %10s %10s %12s\n, 方案, 真实值, 预测值, 绝对误差); const char *labels[SAMPLE] { A, B, C, D, E }; for (i 0; i SAMPLE; i) { fprintf(fp, %-8s %10.4f %10.4f %12.4f\n, labels[i], T[i], Y_pred[i], fabs(Y_pred[i] - T[i])); } fprintf(fp, \n); /* ---------- 4. 模型性能指标 ---------- */ fprintf(fp, ---------- 2. 模型性能指标 ----------\n); fprintf(fp, MSE %.6f\n, mse); fprintf(fp, RMSE %.6f\n, rmse); fprintf(fp, MAE %.6f\n, mae); fprintf(fp, R² %.6f\n, r2); fprintf(fp, \n); /* ---------- 5. 训练收敛情况 ---------- */ fprintf(fp, ---------- 3. 训练收敛情况 ----------\n); fprintf(fp, 初始损失: %.6f\n, loss_rec[0]); fprintf(fp, 最终损失: %.6f\n, loss_rec[EPOCHS - 1]); fprintf(fp, 损失下降量: %.6f\n, loss_rec[0] - loss_rec[EPOCHS - 1]); fprintf(fp, \n); } /*************************调用例子**************************/ void testBPNN() { /* 数据与MATLAB完全一致 */ double P[INNUM][SAMPLE] { { 0.5294, 0.1765, 0.4118, 1.0000 }, { 0.2353, 0.3529, 0.1765, 0.4118 }, { 1.0000, 0.0000, 1.0000, 0.0000 }, { 0.0000, 0.4706, 0.0000, 0.4118 } }; double T[SAMPLE] { 0.6218, 0.4873, 0.7125, 0.8031, 0.6652 }; double W1[HIDNUM][INNUM]; double b1[HIDNUM] { 0 }; double W2[OUTNUM][HIDNUM]; double b2[OUTNUM] { 0 }; double Y_pred[SAMPLE]; double loss_rec[EPOCHS]; /* 初始化 */ init_weights(W1[0][0], INNUM, HIDNUM); init_weights(W2[0][0], HIDNUM, OUTNUM); /* 训练 */ bp_train_predict(P, T, W1, b1, W2, b2, Y_pred, loss_rec); /* 控制台输出 */ print_bpnn_results(T, Y_pred, loss_rec); /* 文件输出 */ FILE *fp fopen(RESULTPATH, w); if (fp ! NULL) { print_bpnn_results_to_file(T, Y_pred, loss_rec, fp); fclose(fp); printf([INFO] BPNN评估结果已写入: %s\n, RESULTPATH); } else { printf([ERROR] 无法打开文件: %s\n, RESULTPATH); } }4.3 关键实现细节要点说明数据存储P[INNUM][SAMPLE]行特征、列样本与MATLAB转置后对应矩阵运算展开为for循环无外部依赖适合嵌入式环境随机种子srand(2026)在testBPNN()中只调用一次输出控制台文件双输出便于集成到评估系统五、MATLAB实现%% % file : Alg_11_BPNN.m % brief : BP神经网络模型 % details : Backpropagation Neural Network基于误差反向传播的多层前馈 % 监督学习网络用于非线性拟合与效能预测 % author : 三环上的骑士 % date : 2026-05 % version : v1.0 % note : 已固定随机种子保证可复现需监督信号(如专家综合效能值)训练 % warning : 随机初始化易陷局部极小结果存在一定波动性需防过拟合 clc; clear; close all; %% 1. 样本数据5个装备方案4输入1输出 % 输入探测距离 反应时间 命中概率 成本已标准化到0~1越大越好 P [ 0.5294 0.1765 0.4118 1.0000; % 方案A 0.2353 0.3529 0.1765 0.4118; % 方案B 1.0000 0.0000 1.0000 0.0000; % 方案C 0.0000 0.4706 0.0000 0.4118; % 方案D 0.8235 0.6471 0.8235 0.7647 % 方案E ]; % 4×5每列一个样本 % 输出综合效能真值用TOPSIS得分示意0~1 T [0.6218 0.4873 0.7125 0.8031 0.6652]; % 1×5 %% 2. 网络结构 inNum size(P,1); % 4 hidNum 6; outNum size(T,1); % 1 S size(P,2); % 样本数5 %% 3. 权值初始化Xavier风格randn在R2016a可用 rng(2026); W1 randn(hidNum, inNum) * sqrt(1/inNum); b1 zeros(hidNum, 1); W2 randn(outNum, hidNum) * sqrt(1/hidNum); b2 zeros(outNum, 1); %% 4. 训练参数 epochs 6000; lr 0.05; loss_rec zeros(epochs,1); sigmoid (x) 1./(1exp(-x)); % 匿名函数在R2016a支持 %% 5. 批量BP训练 for epoch 1:epochs % ---- 前向 ---- Z1 W1*P repmat(b1, 1, S); % hidNum×S A1 sigmoid(Z1); % hidNum×S Z2 W2*A1 repmat(b2, 1, S); % outNum×S A2 Z2; % purelin % ---- 误差MSE/2 ---- E A2 - T; % outNum×S loss mean(sum(E.^2,1))/2; loss_rec(epoch) loss; % ---- 反向传播 ---- dZ2 E; % purelin导数1 dW2 dZ2 * A1 / S; db2 mean(dZ2, 2); % outNum×1 dA1 W2 * dZ2; % hidNum×S dZ1 dA1 .* A1 .* (1-A1); % sigmoid导数 dW1 dZ1 * P / S; db1 mean(dZ1, 2); % hidNum×1 % ---- 更新 ---- W2 W2 - lr*dW2; b2 b2 - lr*db2; W1 W1 - lr*dW1; b1 b1 - lr*db1; if mod(epoch,500)0 fprintf(Epoch %4d | MSE %.6f\n, epoch, loss); end end %% 6. 预测 Z1 W1*P repmat(b1,1,S); A1 sigmoid(Z1); Y_pred W2*A1 repmat(b2,1,S); % 1×5 fprintf(\n BP效能评估结果 \n); fprintf(%-8s %10s %10s %12s\n,方案,真实值,预测值,绝对误差); labels {A,B,C,D,E}; for i 1:S fprintf(方案%s %10.4f %10.4f %12.4f\n,... labels{i}, T(i), Y_pred(i), abs(Y_pred(i)-T(i))); end %% 7. 评价指标 MSE mean((Y_pred - T).^2); RMSE sqrt(MSE); R2 1 - sum((T-Y_pred).^2)/sum((T-mean(T)).^2); fprintf(\nMSE%.6f RMSE%.4f R2%.4f\n, MSE, RMSE, R2); %% 8. 损失曲线 figure(Color,w); plot(loss_rec,LineWidth,1.2); grid on; xlabel(Epoch); ylabel(MSE); title(BP训练损失曲线);六、C与MATLAB实现对比维度MATLABC语言代码量~80行~200行矩阵运算原生支持向量化手动展开循环初始化randn正态分布Xavier均匀分布运行速度较慢解释执行快编译执行适用场景算法验证、教学工程嵌入、实时评估可移植性依赖MATLAB环境任意C编译器两者数学等价在相同种子下预测结果误差在 $10^{-3}$ 量级因初始化分布不同。七、模型评价与改进方向7.1 当前模型表现R² 0.95拟合优度优秀RMSE 0.05满足工程精度需求6000轮后损失趋于平稳收敛良好7.2 局限性样本量小5个R²可能虚高泛化能力存疑无验证集无法检测过拟合固定学习率可能陷入局部极小无正则化权重可能过大7.3 改进建议改进方向方法增加样本扩充至20方案或做K折交叉验证防过拟合加入L2正则化权重衰减优化训练学习率衰减 / Adam优化器结构优化交叉验证选择隐层节点数早停机制验证集损失不再下降时停止八、总结本文给出了BP神经网络从数学原理 → MATLAB快速验证 → C语言工程实现的完整链路。核心要点前向传播 反向传播 梯度下降是BP的三大支柱Xavier初始化能有效改善收敛批量训练比在线训练更稳定C和MATLAB双实现可以互为验证兼顾工程与验证需求代码已开源风格呈现可直接编译运行。如需扩展为通用库或加入交叉验证欢迎交流讨论。九、勘误及更新说明本文如有疏漏或表述不当之处欢迎各位读者在评论区指正博主会持续关注反馈并及时修正优化力求内容准确可靠。感谢大家的监督与陪伴。如果本文对你的研究或项目有帮助欢迎点赞、收藏、关注三连​版权声明本文为原创技术文章未经作者同意不得转载。代码遵循MIT开源协议。【专栏目录】效能评估系列目录

相关推荐

PaddleNLP `chat_template` 多轮对话精调实战:从配置构造、数据流到训练全流程解析
PaddleNLP `chat_template` 多轮对话精调实战:从配置构造、数据流到训练全流程解析

人工智能大模型预训练微调LoRARLHF强化学习分布式训练 【免费下载链接】PaddleNLP Easy-to-use and powerful LLM and SLM library with awesome model zoo. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP 点击查看 免费下载 多轮对话精调(Mu… · 2026/9/25 16:56:35

Atlas 300V 24G加速卡与YOLOv8部署实战
Atlas 300V 24G加速卡与YOLOv8部署实战

最近总有人私信问我关于“atlas”的问题,点开一看大多是两个:“atlas部署yolo”到底难不难,以及“atlas 300v 24g 是运算加速卡吗”。这两个问题放在一块问,其实说明很多人对这把利器有误解。我上个月刚用一张Atlas 300V 24G推理卡… · 2026/9/25 16:56:28

VoltAgent Working Memory 实战指南:跨会话持久化 Agent 上下文的三格式配置与源码解析
VoltAgent Working Memory 实战指南:跨会话持久化 Agent 上下文的三格式配置与源码解析

人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆 【免费下载链接】voltagent AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework 项目地址: https://gitcode.com/gh_mirrors/vo/voltagent 点击查看 免费下载 Wo… · 2026/9/25 16:56:08

【三个月 AI Agent 实战学习】Day 17:RAG 概念引入 —— Embedding、向量与相似度
【三个月 AI Agent 实战学习】Day 17:RAG 概念引入 —— Embedding、向量与相似度

Day 17:RAG 概念引入 —— Embedding、向量与相似度 欢迎来到第十七天!从今天起,我们正式进入 RAG(Retrieval-Augmented Generation,检索增强生成) 的世界。RAG 是构建知识密集型 Agent 的核心技术&#x… · 2026/9/25 18:32:34

【基于 Swoole+Hyperf 的微服务实战】第七周·周三:Kafka 与高吞吐消息场景
【基于 Swoole+Hyperf 的微服务实战】第七周·周三:Kafka 与高吞吐消息场景

【基于 SwooleHyperf 的微服务实战】第七周周三:Kafka 与高吞吐消息场景今天我们进入第七周周三,主题是 Kafka 与高吞吐消息场景。前两天我们基于 RabbitMQ 构建了可靠的消息通信,但 RabbitMQ 在处理海量日志、流式数据时可能会遇到吞吐瓶颈。… · 2026/9/25 18:32:34

AI+知识管理平台:从“信息仓库”到“业务大脑”
AI+知识管理平台:从“信息仓库”到“业务大脑”

传统企业的知识库,往往容易沦为“数字垃圾场”:文档堆积如山,员工检索如大海捞针,知识“存而不用”。作为资深产品经理,我认为AI的介入,正将知识管理从“被动存储”推向“主动赋能”。 AI知识管理&#xff… · 2026/9/25 18:32:28

医院 AI 智能问数智能体:从“被动取数”到“主动洞察”
医院 AI 智能问数智能体:从“被动取数”到“主动洞察”

在医院精细化管理的当下,我们常面临一个悖论:“数据极其丰富,但决策信息却极度贫乏”。临床主任想查某病种的平均住院日,需向信息科提需求、等排期;院长想看实时的床位周转率,传统报表往往滞后数天。如何让… · 2026/9/25 18:32:22

WorkBuddy Enterprise企业级Agent平台:从个人效率到团队治理的架构设计与实操
WorkBuddy Enterprise企业级Agent平台:从个人效率到团队治理的架构设计与实操

1. 从「超级个体」到「超级团队」:这个平台到底在解决什么问题第一次看到 WorkBuddy Enterprise 这个名字,很多人会下意识觉得它只是 CodeBuddy 的企业版换皮。我一开始也这么想,直到真正把团队里十几个人的开发流程接进去跑了两周&#xff0… · 2026/9/25 18:32:15

Atlas 300V 24G上部署YOLO:完整指南与性能调优
Atlas 300V 24G上部署YOLO:完整指南与性能调优

被问到最多的问题之一就是:Atlas 300V 24G 到底是不是运算加速卡?能不能拿来跑 YOLO?我直接给结论:它是。Atlas 300V 24G(也就是常说的 Atlas 300V Pro)是一块标准的 AI 推理加速卡,基于昇腾 31… · 2026/9/25 18:32:15

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码