out文件是hdf普通软件无法读取5格式文件。
Matlab中与hdf5相关的文件
h5read
h5read:从 HDF5 数据集读取数据 语法: :读取 HDF5 文件 filename 数据集中包含 ds 所有数据。 :从数据集中 start 开始读取指定位置的数据子集。count 参数指定沿各维度读取的元素数。 :以 stride 指定的数据集各维索引间隔返回数据子集。
h5info
返回整个 HDF5 文件的相关信息包括组、数据集和命名数据类型。 返回 HDF5 文件中指定位置的相关信息。 被迫将对象和属性名称视为强制性对象和属性名称 UTF-8 编码文本 HDF5 准确指定文件的使用 UTF-8 这种用法是不必要的。
h5disp
描述指定的显示 HDF5 元数据的文件结构。 显示文件中指定位置的元数据。 (其中 mode 是 ‘min只显示组和数据集的名称。mode 的默认值为 ‘simple它显示数据集数据和属性值。 被迫将对象和属性名称视为强制性对象和属性名称 UTF-8 编码文本 HDF5 准确指定文件的使用 UTF-8 这种用法是不必要的。
打开gprmax中的out文件
首先使用h5disp命令来查看gprmax结构和内容 在matlab中输入h5disp('E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out')
打开了gprmax中自带的out结果如下:
>> h5disp('E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out') HDF5 cylinder_Ascan_2D.out Group '/' Attributes: 'gprMax': '3.1.5' 'Title': 'A-scan from a metal cylinder buried in a dielectric half-space' 'Iterations': 637 'nx_ny_nz': 120 105 1 'dx_dy_dz': 0.002000 0.002000 0.002000 'dt': 0.000000 'nsrc': 1 'nrx': 1 'srcsteps': 0 0 0 'rxsteps': 0 0 0 Group '/rxs' Group '/rxs/rx1' Attributes: 'Name': 'Rx(70,85,0)' 'Position': 0.140000 0.170000 0.000000 Dataset 'Ex' Size: 637 MaxSize: 637 Datatype: H5T_IEEE_F32LE (single) ChunkSize: [] Filter: none
FillValue: 0.000000
Dataset 'Ey'
Size: 637
MaxSize: 637
Datatype: H5T_IEEE_F32LE (single)
ChunkSize: []
Filters: none
FillValue: 0.000000
Dataset 'Ez'
Size: 637
MaxSize: 637
Datatype: H5T_IEEE_F32LE (single)
ChunkSize: []
Filters: none
FillValue: 0.000000
Dataset 'Hx'
Size: 637
MaxSize: 637
Datatype: H5T_IEEE_F32LE (single)
ChunkSize: []
Filters: none
FillValue: 0.000000
Dataset 'Hy'
Size: 637
MaxSize: 637
Datatype: H5T_IEEE_F32LE (single)
ChunkSize: []
Filters: none
FillValue: 0.000000
Dataset 'Hz'
Size: 637
MaxSize: 637
Datatype: H5T_IEEE_F32LE (single)
ChunkSize: []
Filters: none
FillValue: 0.000000
Group '/srcs'
Group '/srcs/src1'
Attributes:
'Type': 'HertzianDipole'
'Position': 0.100000 0.170000 0.000000
>>
从代码中我们可以看到该out文件的基本结构,首先在最外层是一个Group,在这个Group中又包含了Attribute和两个Group,在这个Group中又包含Group、Attribute和Dataset。Attributes里面包含了正演模拟的基本信息:gprmax版本、文件名、迭代次数、网格数、网格步长、采样时间间隔、发射点个数、接受点个数、移动步长等信息。两个子group里面包含了源的信息,主要有:场强数据、位置信息、规模等 然后试试h5info函数:在matlab中输入info=h5info('E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out')
得到如下结果:
>> info=h5info('E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out')
info =
包含以下字段的 struct:
Filename: 'E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out'
Name: '/'
Groups: [2×1 struct]
Datasets: []
Datatypes: []
Links: []
Attributes: [10×1 struct]
>>
可以看到使用h5info也可以来查看out文件的信息,但是明显使用h5disp查看到的信息更多,结构也更加清楚
文件结构
输出文件在根(/)处具有以下HDF5属性:
- gprMax gprMax是用于创建输出的gprMax的版本号
- Title 是模型的标题
- Iterations是模型时间窗口的迭代次数
- nx_ny_nz是一个元组,包含模型每个方向上的单元数
- dx_dy_dz是包含空间离散化的元组,即Δx、Δy、Δz
- dt是模型的时间步长,即Δt
- srcsteps是用于在模型运行之间移动所有源的空间增量。
- rxsteps是用于在模型运行之间移动所有接收器的空间增量。
- nsrc是模型中的源总数。
- nrx是模型中接收器的总数。
输出文件包含源(SRC)、传输线(TL)和接收器(RX)的HDF5组。在每个组中,还有与单个源/传输线/接收器相对应的其他组,例如src1、src2等… 在每个单独的rx
组中有以下属性:
Name
Name是指定的接收方的名称。否则使用“Rx(x,y,z)”,其中x,y,z是接收器的位置。Position
位置是模型中接收器的x、y、z位置(以米为单位)。
在每个单独的rx组中可以有以下数据集:
Ex
Ex是一个数组,包含接收器位置处电场x分量值的时间历史(对于模型时间窗口)。Ey
是一个数组,包含该接收器位置处电场y分量值的时间历史(对于模型时间窗口)。Ez
是一个数组,包含接收器位置处电场z分量值的时间历史(对于模型时间窗口)Hx
是一个数组,包含接收器位置处磁场x分量值的时间历史(对于模型时间窗口)。- Hy是一个数组,包含接收器位置处磁场y分量值的时间历史(对于模型时间窗口)。
- Hz是一个数组,包含接收器位置处磁场z分量值的时间历史(对于模型时间窗口)。
- Ix是一个可选数组,包含接收器位置处电流x分量(围绕单个单元回路计算)值的时间历史(对于模型时间窗口)。
- Iy是一个可选数组,包含该接收器位置处电流y分量(围绕单个单元回路计算)值的时间历史(对于模型时间窗口)。
- Iz是一个可选数组,包含该接收器位置处电流z分量(围绕单个单元回路计算)值的时间历史(对于模型时间窗口)。
每个src组中都有以下属性:
Type
是源的类型,例如赫兹偶极子、电压源等…Position
是源在模型中的x、y、z位置(以米为单位)。
每个tl组中都有以下属性:
Position
位置是源在模型中的x、y、z位置(以米为单位)。Resistance
是传输线的电阻。dl
是传输线的空间离散化。
每个tl组内都有以下数据集:
Vinc
是一个数组,包含传输线中入射电压值的时间历史(对于模型时间窗)。- Iinc是一个数组,包含传输线中入射电流值的时间历史(对于模型时间窗口)。
- Vtotal是一个数组,包含传输线中总(场)电压值的时间历史(对于模型时间窗口)。
- Itotal是一个数组,包含传输线中总(场)电流值的时间历史(对于模型时间窗口)。
h5read读取文件
在matlab中输入field=h5read(‘E:\mygpr\gprMax\user_models\cylinder_Ascan_2D.out’,‘/rxs/rx1/Ex’)可以得到637x1的数据,在输入第二个参数的时候,直接取最近的group的地址,不用加外层group的名称。 附上一个读取A-scan的代码:
function [Ascan] = readgprMax()
[filename, pathname] = uigetfile('*.out', 'Select gprMax A-scan output file to plot');
fullfilename = strcat(pathname, filename);
if filename ~= 0
header.title = h5readatt(fullfilename, '/', 'Title');
header.iterations = double(h5readatt(fullfilename,'/', 'Iterations'));
tmp = h5readatt(fullfilename, '/', 'dx_dy_dz');
header.dx = tmp(1);
header.dy = tmp(2);
header.dz = tmp(3);
header.dt = h5readatt(fullfilename, '/', 'dt');
header.nsrc = h5readatt(fullfilename, '/', 'nsrc');
header.nrx = h5readatt(fullfilename, '/', 'nrx');
//时间向量
time = linspace(0, (header.iterations - 1) * header.dt, header.iterations)';
//初始化
fields.ex = zeros(header.iterations, header.nrx);
fields.ey = zeros(header.iterations, header.nrx);
fields.ez = zeros(header.iterations, header.nrx);
fields.hx = zeros(header.iterations, header.nrx);
fields.hy = zeros(header.iterations, header.nrx);
fields.hz = zeros(header.iterations, header.nrx);
//赋值
for n=1:header.nrx
path = strcat('/rxs/rx', num2str(n));
tmp = h5readatt(fullfilename, path, 'Position');
header.rx(n) = tmp(1);
header.ry(n) = tmp(2);
header.rz(n) = tmp(3);
path = strcat(path, '/');
fields.ex(:,n) = h5read(fullfilename, strcat(path, 'Ex'));
fields.ey(:,n) = h5read(fullfilename, strcat(path, 'Ey'));
fields.ez(:,n) = h5read(fullfilename, strcat(path, 'Ez'));
fields.hx(:,n) = h5read(fullfilename, strcat(path, 'Hx'));
fields.hy(:,n) = h5read(fullfilename, strcat(path, 'Hy'));
fields.hz(:,n) = h5read(fullfilename, strcat(path, 'Hz'));
end
Ascan.header=header;
Ascan.fields=fields;
end
在需要读取的地方调用
trace=readgprMax();
RFImpulse=trace.fields.ez;
RFImpulse就是需要的数据,可以用它进行后续处理。