新闻详情

新闻详情

首页 / 资讯中心 / 详情

MATLAB声发射数据分析:滑动窗口计算b值、熵值、CV值等特征

发布时间:2026/9/15 21:17:54来源:尧图网络
MATLAB声发射数据分析:滑动窗口计算b值、熵值、CV值等特征
做声发射实验的人应该都经历过这种场景实验跑完采集系统导出几万个事件Excel一打开就直接卡死更别说还要在数据里提取声发射b值、熵值、活动度S值、变异系数CV值、均值方差、自相关系数Acf这些统计特征了。我最初用Python脚本折腾过一阵后来又试过Origin模板最终发现在MATLAB里自己写一套统计分析脚本才是最顺手的——尤其是需要在时序上跑滑动窗口、逐窗输出b值和CV值变化曲线时MATLAB的矩阵语法和内置画图能力能把整个流程压缩在几十行以内。这篇文章把我自己用的一套方案完整放出来从每个参数的计算原理、滑动窗口设计到避坑经验一起讲清楚。适合正在做声发射实验但被数据处理卡住的研究生也适合做材料损伤监测、岩石破裂实验、结构健康监测的工程师参考。按这套流程你拿到自己的事件表之后改两行路径和参数就能批量输出声发射b值、信息熵、活动度S值、均值、方差、变异系数CV、滞后一阶自相关系数Acf的全程演化曲线。1. 分析前先搞明白六个参数各自的物理含义与适用场景1.1 为什么声发射时序数据一定要算统计特征声发射原始数据本质上是一张离散事件列表每条记录包含发生时间、峰值幅值、能量、上升时间、持续时间等。单个事件说明不了什么问题真正能反映损伤状态的是整体统计特征。b值反映事件强度分布中大小事件的占比关系熵值反映事件强度分布的集中度活动度S值反映事件发生的频率CV值反映波动大小Acf反映相邻事件强度之间的时序相关性。这些指标组合起来能帮助我们“看到”材料从分散微破裂到局部化宏观破坏的演化过程。只盯着原始幅值或能量曲线看很容易被异常单点干扰而统计特征具有抗噪性和趋势性更适合做长期监测。这也是为什么岩石力学、地震学、无损检测领域都把这类参数写进预警判据里的原因。1.2 声发射b值到底是什么怎么定义才合理声发射b值是从地震学Gutenberg-Richter关系引入的log10(N) a - bM其中N表示震级大于等于M的事件累计数a描述总体活动水平b描述大小事件的相对比例。声发射研究中通常把事件峰值幅值当作“震级”但这里有一个单位口径问题很多人会踩坑。如果直接用幅值dB因为dB本身就是取过对数再乘20的线性标度得到的b值数值与地震学口径完全不同如果之后要和别人的结果对比一定要在论文里写清楚你是用dB还是用线性电压取log后的等效震级。我个人的习惯是看相对趋势直接对峰值幅值dB计算没有毛病但为了严谨我会同时算一版把幅值换算成等效震级的结果。换算代码很简单线性电压 amp_lin 10.^(amp_dB ./ 20)等效震级 M log10(amp_lin)。两种口径算出来的b值数值相差一个常数倍数但变化趋势一致用于预警判据时不会影响结论。b值计算还需要指定一个完整性阈值Mc。这个Mc很关键它表示只有幅值大于等于该值的事件才纳入统计目的是剔除噪声和小幅值干扰。Mc设低了会把底噪算进去b值被拉高Mc设高了会丢掉真实微破裂信息事件数不足时统计结果不稳定。我通常根据设备底噪来设置比如系统底噪在35dBMc就取40到45dB之间。1.3 熵值、S值、CV值与Acf的判定逻辑信息熵在这里指的是香农熵把一个滑动窗口内的幅值分成若干等宽区间统计各区间的概率p然后计算H -Σ p·log2p。分布越均匀熵越大分布越集中熵越小。损伤进入局部化阶段时幅值分布往往会从分散变集中所以熵值曲线常出现下行趋势。活动度S值是最直观的指标定义为单位时间内的事件数量单位是“个/秒”反映裂纹活动的剧烈程度。加载速率不变的情况下S值上升说明裂纹扩展在加速这在临近破坏时非常明显。变异系数CV 标准差/均值它消除均值水平对离散度的影响特别适合不同加载速率、不同试件之间的对比。比如A组幅值均值60dB、标准差6B组均值80dB、标准差8绝对标准差不同但CV都是0.1说明相对波动程度一致。自相关系数Acf描述序列与自身滞后版本的相关性我这里通常只关注滞后一阶的结果。如果相邻声发射事件的幅值呈现出强相关性说明事件强度有“记忆性”损伤进程有趋势性如果Acf接近0说明事件接近独立随机。下面这张表是我在项目里的速查表每次封装函数前都会对着确认一遍参数数学表达式MATLAB实现思路主要用途b值log10N a - bM极大似然法/最小二乘法大小事件占比、破裂尺度趋势熵值H -Σp·log2p幅值分箱后统计概率幅值分布集中度S值S N/Δt窗口事件数除时间跨度活动剧烈程度均值μ Σx/Nmean幅值中心水平方差σ² Σ(x-μ)²/(N-1)std的平方绝对波动CV值CV σ/μstd/mean相对离散度Acfr1 corr(x_t, x_{t1})滞后一阶Pearson相关时序相关性、趋势性2. 核心代码实现从读取数据到计算b值/熵值/S/CV/Acf2.1 数据读取与格式统一先解决源头问题声发射采集设备品牌不同导出格式五花八门但核心信息大同小异一般都有事件时间、峰值幅值、能量、上升时间、持续时间这几列。我建议先统一成一行一事件的纯数值文件方便后续处理。这里给一个模拟数据生成片段方便没有现成数据的读者先跑通流程rng(2024); ntotal 1500; t cumsum(0.02 0.08 * rand(ntotal, 1)); % 模拟到达时间间隔 amp_db 50 15 * randn(ntotal, 1) ... 5 * sin(linspace(0, 4*pi, ntotal)); % 模拟幅值趋势 amp_db max(amp_db, 30); ene 10.^(amp_db / 20) .* (0.5 rand(ntotal, 1)); % 模拟能量 data [t, amp_db, ene]; writematrix(data, AE_demo.csv);自己实验数据导入时优先用readmatrix读取纯数值文件。如果你的采集设备导出的是带表头Excel用readtable再转数组就行。注意readmatrix在MATLAB R2019a版本才引入老版本可以改用csvread或importdata。data readmatrix(AE_demo.csv); t data(:, 1); amp data(:, 2); ene data(:, 3);这里有一个很实际的提醒文件路径里不要出现中文和空格。MATLAB对中文路径的支持时好时坏曾经有位师弟把数据放在“D:\实验数据\试件1\”下面怎么读都报错改成英文路径后一次通过。这个细节能帮你节省半小时。2.2 声发射b值计算的两种实现极大似然法最小二乘b值的计算在文献里主要有两种极大似然法和最小二乘法。极大似然法用Utsu公式b log10(e)/(mean(M) - Mc)这个公式简洁且对异常值不敏感是目前的主流做法。它的方差近似为 b/sqrt(N-1)据此可以给出置信区间这在实际判读时很有价值。function [b, b_low, b_high] calc_bvalue_mle(M, Mc) % M : 窗口内事件幅值单位dB或等效震级 % Mc : 完整性阈值建议取底噪以上5~10dB M M(M Mc); N length(M); if N 30 b NaN; b_low NaN; b_high NaN; return; end M_mean mean(M); b log10(exp(1)) / (M_mean - Mc); sigma_b b / sqrt(N - 1); b_low b - 1.96 * sigma_b; b_high b 1.96 * sigma_b; end最小二乘法则是对累积频次分布做线性拟合斜率取负值。这个方法的优点是直观缺点是对分箱宽度和拟合区间敏感。分箱宽度dM建议用1dB窗口事件数多时可以用0.5dB。function [b, r2] calc_bvalue_lsq(M, dM) % M : 窗口内事件幅值 % dM : 幅值分箱宽度默认1dB if nargin 2, dM 1; end M M(~isnan(M)); if length(M) 20 b NaN; r2 NaN; return; end edges min(M):dM:max(M)dM; Nc histcounts(M, edges); Ncum fliplr(cumsum(fliplr(Nc))); % 累计频次 Mc_center edges(1:end-1) dM/2; valid Ncum 1; x Mc_center(valid); y log10(Ncum(valid)); P polyfit(x, y, 1); b -P(1); yhat polyval(P, x); r2 1 - sum((y - yhat).^2) / sum((y - mean(y)).^2); end两个方法各有利弊我在实际项目中习惯以极大似然法为主最小二乘法作为交叉验证。如果两个结果差异超过0.2说明窗口内数据质量可能有问题比如幅值饱和或者混入了标定信号。2.3 熵值与活动度S值的MATLAB实现熵值计算的核心是概率统计这里用histcounts分箱。分箱数量对结果影响很大太少了丢信息太多了单个箱概率过小熵值对噪声敏感。我用窗口内事件数Nwin来定Nwin300时取20到50箱比较合适。function H calc_entropy(M, nbins) % M : 窗口内事件幅值 % nbins : 分箱数量 if nargin 2, nbins 50; end [C, ~] histcounts(M, nbins); p C / sum(C); p p(p 0); H -sum(p .* log2(p)); end活动度S值的计算更直接一些。给定窗口内事件时间t_win时间跨度是max(t_win)-min(t_win)S 窗口内事件数除以时间跨度。需要注意如果窗口内事件数太少时间跨度可能为零要做保护。function S calc_svalue(t_win) % t_win : 窗口内事件发生时间列向量 if length(t_win) 2 S NaN; return; end span_t max(t_win) - min(t_win); if span_t 0 S NaN; return; end S length(t_win) / span_t; end有些文献把S值定义为事件数除以总加载时间其实差别不大核心是表达“单位时间里的破裂活动量”。只要定义清楚并在论文里写明阅卷人和审稿人都不会挑毛病。2.4 均值、方差、CV与自相关Acf的实现细节均值方差属于基础操作但有一个细节如果材料在窗口内经历了明显的阶段变化大均值方差的解释力会下降这时CV值更可靠。CV的计算注意加一个eps防止除零mu mean(amp_win); sigma std(amp_win); % 默认除以 n-1 cv sigma / (mu eps);自相关Acf我建议手写滞后一阶的计算不依赖任何工具箱。直接用Pearson相关系数function r calc_acf_lag(x, lag) % x : 一维序列 % lag : 滞后阶数 x x(:); if length(x) lag r NaN; return; end x1 x(1:end-lag); x2 x(1lag:end); x1c x1 - mean(x1); x2c x2 - mean(x2); r sum(x1c .* x2c) / sqrt(sum(x1c.^2) * sum(x2c.^2)); end之所以不建议直接用autocorr函数是因为它属于Econometrics Toolbox很多人的MATLAB版本没装这个工具箱运行到一半报错最难处理。xcorr也能算但返回值索引和归一化方式容易搞混与其背索引不如直接用这个手写版本计算量完全可接受。3. 滑动窗口设计如何用MATLAB跑出全程动态演化曲线3.1 事件数窗口还是时间窗口先想清楚再写循环滑动窗口是整个流程的核心。窗口形式有两种时间窗口和事件数窗口。时间窗口物理意义直观比如每隔10秒算一段但事件稀疏时段窗口内可能只有几个事件b值算出来完全没法看。事件数窗口则是每满N个事件算一次每个窗口的样本量固定统计稳定性好。在实际声发射数据分析中我强烈推荐事件数窗口因为b值、熵值这类统计量对样本量敏感固定事件数能保证每个窗口的统计口径一致。事件数窗口的代价是时间分辨率不均匀事件密集时窗口时间短事件稀疏时窗口时间长。这恰好对应破坏过程——临近破坏时事件密集时间分辨率自动变高反而更有利于捕捉快速变化。这个特性在工程预警场景里非常实用。3.2 窗口长度与重叠步长的经验参数窗口长度Nwin至少取50我一般取100到500之间。窗口太小b值估计方差大置信区间宽窗口太大时间分辨率下降变化趋势被抹平。一个经验规律是Nwin取总事件数的3%到10%。滑动步长Nstep决定相邻窗口的重叠程度我习惯取Nwin的四分之一也就是75%重叠曲线平滑而且计算量不会太大。Mc的选取原则前面说过建议根据设备底噪5到10dB来确定。如果窗口内事件数太少比如过滤掉小于Mc的事件后不足30个这次计算直接输出NaN不参与后续绘图和统计。这样不会因为个别窗口的异常值把整条曲线拉偏。3.3 完整滑动主程序一次跑出全部7列指标把所有函数拼起来主程序如下。这个脚本可以直接复制运行输出表会保存为CSV方便后续用其他工具做深度分析。%% AE_sliding_stat.m % 声发射多参数滑动窗统计分析主程序 clear; clc; close all; % ---------- 参数设置 ---------- Nwin 300; % 窗口事件数建议100 Nstep 75; % 滑动步长默认Nwin/4 Mc 45; % 完整性阈值根据设备底噪设定 nbins 30; % 熵值分箱数 % ---------- 读取数据 ---------- data readmatrix(AE_demo.csv); t data(:, 1); amp data(:, 2); ene data(:, 3); % 如果不用能量可忽略 % ---------- 初始化输出 ---------- n_win floor((length(t) - Nwin) / Nstep) 1; b_out nan(n_win, 1); H_out nan(n_win, 1); S_out nan(n_win, 1); mu_out nan(n_win, 1); cv_out nan(n_win, 1); acf_out nan(n_win, 1); tc_out nan(n_win, 1); % ---------- 滑动主循环 ---------- for i 1:n_win idx (i-1) * Nstep 1 : (i-1) * Nstep Nwin; t_win t(idx); a_win amp(idx); if all(diff(t_win) 0) b_out(i) calc_bvalue_mle(a_win, Mc); H_out(i) calc_entropy(a_win, nbins); S_out(i) calc_svalue(t_win); mu_out(i) mean(a_win); cv_out(i) std(a_win) / (mean(a_win) eps); acf_out(i) calc_acf_lag(a_win, 1); tc_out(i) mean(t_win); % 窗口中心时刻 end end % ---------- 保存结果 ---------- T_out table(tc_out, b_out, H_out, S_out, mu_out, cv_out, acf_out, ... VariableNames, {t_center,b,entropy,S,mean,CV,ACF}); writetable(T_out, AE_stats_result.csv); disp(滑动窗分析完成结果已保存到 AE_stats_result.csv);这段循环在30万事件、步长75的情况下会产生约4000个窗口运行时间在几秒到几十秒之间完全在可接受范围。如果数据量到百万级别建议先把amp提前转为single类型内存占用会小一半。4. 可视化与结果解读多参数联动怎么判断损伤阶段4.1 多指标时序图一张图看完整加载过程计算结果出来后第一时间画图。我通常把b值、熵值、S值、CV值放在同一张图的不同子图里横轴统一为时间这样方便横向对比。figure(Position, [100, 100, 900, 700]); subplot(4, 1, 1); plot(tc_out, b_out, -o, LineWidth, 1.2); ylabel(b值); grid on; subplot(4, 1, 2); plot(tc_out, H_out, -o, LineWidth, 1.2); ylabel(熵值); grid on; subplot(4, 1, 3); plot(tc_out, S_out, -o, LineWidth, 1.2); ylabel(S值); grid on; subplot(4, 1, 4); plot(tc_out, cv_out, -o, LineWidth, 1.2); ylabel(CV值); xlabel(时间 (s)); grid on; saveas(gcf, AE_overview.png);实际上我还会顺手画一版事件幅值散点图放在最上面这样能直接看到原始数据质量比如是否有幅值饱和、是否有异常事件段。底层参数曲线配合原始数据图判断起来才心里有底。4.2 从b值变化到失稳前兆的判读思路b值的经典判读规律来自地震学和岩石力学实验正常情况下微破裂占主导b值偏高通常在1.0以上当裂纹开始集中扩展、大尺度破裂占比上升时b值持续下降临近宏观破坏时b值往往降到很低甚至低于0.7。我在三轴压缩实验中还观察到一种现象破坏前b值会出现短时回升有点像“平静期”然后急速下降紧接着就是宏观失稳。这个短期回升容易让人误判为安全但配合CV值一起看就能避开——b值回升的同一时段CV值通常在高位震荡或继续攀升说明系统并不稳定。单纯依赖b值做判据风险很大所以我的项目里一直强调多参数联合判断。CV值持续上升说明幅值波动越来越大熵值持续下降说明幅值分布趋向集中S值激增说明裂纹活动加速Acf升高说明事件强度相关性增强。这几个指标如果同时出现破坏概率就非常高了。4.3 CV、熵值、Acf如何配合b值交叉验证下面这张表是我常用的阶段判读参考数值范围因材料而异这里给出的是岩石、混凝土试件的典型经验值阶段b值熵值S值CV值综合判读压密/稳定期1.0~1.4稳定低低随机微破裂为主损伤扩展期持续下降下降上升上升裂纹集中扩展破坏前兆期低于0.7偏低激增很高宏观失稳临近失稳后回升或骤变紊乱回落/消失异常结构已破坏熵值和Acf的作用经常被低估。熵值下降说明幅值分布集中实际上意味着各种尺度的破裂种类变少系统从“多种机制并行”向“单一主破裂机制”演化。Acf升高说明相邻事件的强度关联增强事件不再是独立随机发生而是沿着某个已经形成的损伤区连锁触发。这两个信号在b值还在缓降阶段时可能就已经出现算是更早的趋势指示器。5. 常见问题与排查技巧这几类坑我劝你提前避开5.1 b值算出来离谱先查这4件事b值异常高或异常低很多时候不是代码的问题而是数据口径的问题。我排查的顺序如下第一看窗口事件数是否太少少于30个算出来的b值方差非常大置信区间能跨0.5第二看Mc设置是否合理Mc偏低会把成片噪声归入事件b值被拉高第三看是否混入了标定信号很多实验室在加载前会用断铅做标定这类事件幅值固定、能量很高混进窗口后会把b值拉低第四看幅值是否饱和如果采集卡的输入范围设置不当大量事件幅值被顶到90dB或更高频度-幅值关系就会出现平台最小二乘拟合自然失效。排查手段也很简单先画一张全时段的事件幅值-时间散点图底噪水平、饱和平台、异常事件段一眼就能看出来。我每次拿到新批次数据都会先做这一步比直接跑统计脚本省心得多。5.2 autocorr、xcorr与手写ACF的边界自相关的坑主要是工具箱依赖和索引位置。autocorr需要Econometrics Toolbox虽然功能完整但没装工具箱的人一运行就报错xcorr是信号处理工具箱的函数几乎人人都有但它返回的自相关序列长度是2N-1中心点在N滞后1阶对应的索引是N-1很容易搞混而且norm选项不同归一化方式差别很大。我的建议是直接用手写滞后相关Pearson相关定义清晰输出直观也利于在论文里解释。只有在需要计算完整自相关谱、做谱分析时才去动用xcorr的完整能力。5.3 版本兼容与读写性能的细节坑readmatrix、writematrix在R2019a之前不存在老版本用户请用csvread、dlmwrite或者importdata。还有一个常见问题是中文路径和首行字符串表头readmatrix默认只读数值遇到文本表头可能报错或跳过结果错位。稳妥的做法是导出数据时把格式统一成纯数值文件表头单独放一个说明文件或者直接用readtable再转数组。数据量超过10万行时表格变量访问速度会明显下降主循环里的每次字段访问都有额外开销这时候可以把t、amp提前转成double数组循环体里直接按索引访问速度能提升好几倍。5.4 一键封装成函数以后换数据只改一行最后给一个工程化建议。不要每次分析都从复制主程序开始而是把所有计算逻辑封装成一个函数function AE_stats run_AE_stats(t, amp, Nwin, Nstep, Mc) % 统一入口函数 % 输出结构体: AE_stats.b, AE_stats.H, AE_stats.S, % AE_stats.mu, AE_stats.cv, AE_stats.acf, AE_stats.tc n_win floor((length(t) - Nwin) / Nstep) 1; AE_stats.b nan(n_win, 1); AE_stats.H nan(n_win, 1); AE_stats.S nan(n_win, 1); AE_stats.mu nan(n_win, 1); AE_stats.cv nan(n_win, 1); AE_stats.acf nan(n_win, 1); AE_stats.tc nan(n_win, 1); for i 1:n_win idx (i-1) * Nstep 1 : (i-1) * Nstep Nwin; t_win t(idx); a_win amp(idx); if all(diff(t_win) 0) AE_stats.b(i) calc_bvalue_mle(a_win, Mc); AE_stats.H(i) calc_entropy(a_win, 30); AE_stats.S(i) calc_svalue(t_win); AE_stats.mu(i) mean(a_win); AE_stats.cv(i) std(a_win) / (mean(a_win) eps); AE_stats.acf(i) calc_acf_lag(a_win, 1); AE_stats.tc(i) mean(t_win); end end end封装完之后以后换了新数据只需要读文件、改参数、调用这个函数三行代码就能出整套结果。这套工具我用到现在已经成为实验室的固定分析流程。每次拿到新的声发射实验数据我基本就是跑一遍读数、改Mc、看趋势——出来的b值曲线、CV曲线、熵值曲线放在一起损伤演化的阶段感非常清楚。我个人在实际操作中的体会是这些参数单独拎出来都不难难的是把阈值和窗口设置可靠地定下来。尤其是Mc的选取不同试验机底噪不一样这套参数在这批数据上表现很好直接搬到另一批数据上很可能会翻车。建议读者拿到第一份自己的数据时先花半天做一次幅值分布直方图和事件数-时间柱状图把底噪水平摸清楚再跑滑动窗比盲目调参要靠谱得多。最后再分享一个小技巧b值和其他参数的趋势判读一定要结合原始数据的质量一起看数据里如果有明显的异常事件段不要盲目相信统计特征的“预警信号”先把原始波形调出来确认一下再做判断。这样虽然多花几分钟但能避免很多误报和错判。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Spring Boot整合AI开发实战:Spring AI框架详解 2026/9/16 0:27:37

Spring Boot整合AI开发实战:Spring AI框架详解

1. 项目概述:当Spring Boot遇上AI能力去年在为一个金融科技项目做技术选型时,我们需要在两周内上线一个智能客服原型。当时尝试了各种AI服务对接方案,最终用Spring BootSpring AI的组合仅用3天就完成了核心功能对接。这种开发效率让我意识到&…

阅读更多 →
基于STM32F103的实时频率跟踪系统:定时器捕获与PWM输入模式解析 2026/9/16 0:27:37

基于STM32F103的实时频率跟踪系统:定时器捕获与PWM输入模式解析

简介:资源为基于STM32F103的实时频率跟踪系统完整工程包,面向嵌入式入门读者与工程开发者,解决输入信号频率测量及LED屏实时显示问题。包内共146个文件,压缩包约2.83MB,以h与c源码文件为主,覆盖定时器输入捕…

阅读更多 →
51单片机电子密码锁实战:硬件匹配、EEPROM存密与防抖设计 2026/9/16 0:27:37

51单片机电子密码锁实战:硬件匹配、EEPROM存密与防抖设计

简介:本资源是一套基于51单片机开发的电子密码锁完整工程实现,面向嵌入式初学者、单片机课程设计学生及电子类实训人员,解决密码输入验证、继电器控制与LED状态反馈等典型人机交互功能的软硬件协同实现问题。压缩包共19个文件,涵盖…

阅读更多 →
Redis 7集群搭建实战:从节点规划到故障转移全解析 2026/9/16 0:27:37

Redis 7集群搭建实战:从节点规划到故障转移全解析

说到 Redis 7 集群搭建,我估计不少朋友已经踩过一轮坑了。网上教程确实多,但要么停留在单个实例的伪集群,要么只贴命令不讲为什么,真到自己动手把多机环境拉起来,还是会卡在节点握手、槽位分配、故障转移这些细节点上。…

阅读更多 →
PHP安全编程实战:防御SQL注入与XSS攻击 2026/9/16 0:27:37

PHP安全编程实战:防御SQL注入与XSS攻击

1. 为什么PHP开发者必须重视安全编程十年前我刚入行时,曾用一段简单的PHP代码处理用户登录,结果导致整个用户数据库被拖库。那天凌晨三点接到运维电话时,我才真正明白安全编程不是选修课,而是生存技能。PHP作为服务端语言的特殊性…

阅读更多 →
第001篇 宇树科技·C++开发工程师面试——变量与数据类型的底层存储 2026/9/16 0:24:35

第001篇 宇树科技·C++开发工程师面试——变量与数据类型的底层存储

宇树科技C开发工程师面试——变量与数据类型的底层存储说实话,面宇树的C岗之前,我一直觉得数据类型这种题就是送分题。直到面试官问出"int在嵌入式平台上到底占几个字节"的那一刻,我才发现背了那么久的八股,连最基础的东…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞