下面仅是参考,若要做好随机介质需要考虑几何尺寸,坐标转换等内容。
工具包优化适合年轻人来做,有精力和想象力!
适用于 Layers + RandomMedia 结构层随机介质建模版本
本次代码修改的目标,是将原有“Excel 读取—生成 gprMax .in 文件—预览模型”的流程升级为支持路面结构层随机介质仿真。用户反馈的问题集中在 RandomMedia 表识别、Excel 混合类型、layer_id 结构层继承以及整体预览等环节。
问题 | 根本原因 | 本次修正 |
RandomMedia 表中没有 enabled=1 | 新版模板中 RandomMedia 使用 layer_id 绑定结构层,z1/z2 留空;旧函数要求 z1/z2 必须为数值,因此误判为无效随机介质。 | gprmax_generate_random_media 统一解析 layer_id;z1/z2 留空时自动从 Layers 表继承。 |
逻辑 AND/OR 操作数必须为标量逻辑值 | Excel 混合列被读取为 cell/string/missing 数组,旧代码直接执行 isempty(v)||ismissing(v)。 | 所有核心函数增加 unwrap_value/to_num/to_str/is_enabled,先拆成标量再判断。 |
不同结构体之间进行下标赋值 | 多个随机介质输出 rmOut 的结构字段或内部维度不一致,结构体数组追加失败。 | randomMediaResults 改为 cell 数组,使用 randomMediaResults{end+1}=rmOut。 |
新版 Excel 字段无法识别 | 新版模板使用 model_name、geometry_view、polarization、scan_step_x、margin_right 等字段,旧代码只识别 title、output_geometry、polarisation、src_step_x 等。 | gprmax_read_excel_config 增加字段别名兼容。 |
升级后的建模逻辑分为三层:第一层为路面结构层 Layers,用于定义沥青面层、基层、底基层和土基等层状骨架;第二层为 RandomMedia,用于在某一层或局部区域内生成随机介电常数场;第三层为Objects,用于添加钢筋、空洞、脱空、含水区等明确几何目标。
写入 gprMax .in 文件时,应遵循“结构层 → 随机介质 → 明确目标 → 天线与输出”的顺序。这样可以保证随机介质作为结构层内的材料扰动,而空洞、钢筋等明确目标不会被随机介质覆盖。
步骤 | 模块 | 作用 |
1 | gprmax_read_excel_config.m | 读取 Global、Materials、Layers、Objects、RandomMedia、AntennaScan 等工作表,形成统一 cfg 结构体。 |
2 | gprmax_generate_random_media.m | 根据 RandomMedia 行生成二维随机介质 epsField,并转换为量化材料和 #box。 |
3 | gprmax_write_in_from_cfg.m | 将 cfg 写入 gprMax .in 文件,包括结构层、随机介质和目标对象。 |
4 | gprmax_preview_cfg.m | 绘制整体模型预览图,显示结构层、随机介质、目标和天线位置。 |
5 | gprmax_preview_random_media_cfg.m | 单独绘制每个随机介质区域的介电常数分布。 |
6 | gprmax_build_from_excel.m | 一键完成读取 Excel、生成 .in、生成预览图和输出运行命令。 |
Sheet | 用途 | 关键字段 |
Global | 模型总体参数 | model_name, Lx, Ly, Lz, dx, dy, dz, time_window_ns, use_layers, geometry_view |
Materials | 材料库 | name, eps_r, sigma, mu_r, sigma_star |
Layers | 路面结构层 | layer_id, name, z1, z2, material, eps_r, sigma |
Objects | 明确病害或目标 | type, x1, z1, x2, z2, radius, thickness, material |
RandomMedia | 随机介质区域与参数 | layer_id, x1, z1, x2, z2, cell_dx, cell_dz, eps_mean, eps_std, eps_min, eps_max, sigma, n_levels, corr_cells_x, corr_cells_z, seed |
AntennaScan | 天线和扫描参数 | freq_GHz, polarization, src_x, src_z, rx_x, rx_z, scan_step_x, margin_right, output_component |
BatchCases | 批量参数示例 | case_id, eps_mean, eps_std, seed 等 |
RandomMedia 表新增 layer_id 字段,用于绑定 Layers 表中的结构层。例如 layer_id=L2 表示随机介质作用于 L2 水泥稳定基层。此时 RandomMedia 表中的 z1/z2 可以留空,程序会自动读取 Layers 表中 L2 的 z1 和 z2。
若 RandomMedia 同时填写了 z1/z2,则显式值优先;若 layer_id 为空,则程序使用 RandomMedia 中的 z1/z2;若 z1/z2 也为空,则退化为全模型深度范围。
RandomMedia: layer_id='L2', x1=1.20, x2=3.20, z1/z2 留空=> 继承 Layers 中 L2 的 z1=0.12, z2=0.35=> 随机介质区域为 x=1.20~3.20 m, z=0.12~0.35 m
疏松病害通常表现为基层或底基层局部压实不足、空隙率增大、材料离析和介电参数不均匀。与正常基层相比,疏松区的等效介电常数可适当降低,随机波动增强,电导率可略低或保持接近正常基层。
场景 | eps_mean | eps_std | eps_min | eps_max | sigma | cell_dx/cell_dz | 说明 |
轻度疏松 | 6.2 | 0.6 | 4.8 | 7.5 | 0.006 | 0.05 / 0.02 m | 基层略不均匀,适合入门仿真。 |
中度疏松 | 5.6 | 1.0 | 4.0 | 7.2 | 0.005 | 0.04 / 0.02 m | 局部材料波动明显,适合识别算法训练。 |
重度疏松 | 4.8 | 1.4 | 3.5 | 7.0 | 0.004 | 0.04 / 0.015 m | 强不均匀,易形成散射增强和层界面扰动。 |
含水不均 | 11.5 | 2.5 | 7.0 | 20.0 | 0.040 | 0.05 / 0.02 m | 用于水损害,不建议与疏松参数混淆。 |
函数 | 输入 | 输出 | 说明 |
gprmax_read_excel_config | configFile | cfg | 读取 Excel,并将各表格转为统一结构体。支持字段别名和 Layers。 |
gprmax_generate_random_media | cfg, rm | rmOut | 根据 RandomMedia 行生成 epsField、materials 和 boxes。支持 layer_id。 |
gprmax_write_in_from_cfg | cfg, inFile | 无 | 导出 .in 文件,保证结构层、随机介质和目标写入顺序。 |
gprmax_preview_cfg | cfg, savePng | png | 绘制整体模型预览图,包括随机介质叠加。 |
gprmax_preview_random_media_cfg | cfg/result/xlsx | png | 单独绘制随机介质分布图。 |
gprmax_build_from_excel | configFile, outDir | result | 一键生成 .in、预览图和运行命令。 |
第一步,在 Excel 的 Layers 表中定义路面结构层;第二步,在 RandomMedia 中选择需要随机化的 layer_id,并设置随机介质参数;第三步,在 Objects 中添加空洞、脱空、钢筋或含水区等明确目标;第四步运行 demo_random_media_from_excel.m。
clc; clear; close all;configFile = 'gprmax_excel_config_template_layers_random_loose_asphalt.xlsx';outDir = fullfile(pwd, 'generated_random_media');result = gprmax_build_from_excel(configFile, outDir);gprmax_preview_random_media_cfg(result.cfg);
后续如果继续扩展,建议保持 cfg 作为唯一数据交换结构。Excel字段变化只应在 gprmax_read_excel_config 中处理;随机介质逻辑只应在 gprmax_generate_random_media 中处理;.in 写入顺序只应在 gprmax_write_in_from_cfg 中维护。这样可以避免多个函数重复判断Excel 类型和字段别名,降低后续维护难度。
在 MATLAB 中替换新版函数后,建议先执行 clear functions,再运行 demo,以避免 MATLAB 继续调用缓存或路径中旧版本函数。
clear functions; clear; clc; close all; demo_random_media_from_excel
下面是excel表


