matlab读取xml文档并储存为.mat文件详解

起因是需要将c++中的矩阵传入matlab中进行处理,发现xml文档可以保留精度,因此选择xml作为中介完成从c++到matlab的数据传递。

xml文档结构如下:

<opencv_storage>

<slope_x type_id="opencv-matrix">

<rows>1500</rows>

<cols>1500</cols>

<dt>f</dt>

<data>

...

</data>

</slope_x>

<slope_y type_id="opencv-matrix">

<rows>1500</rows>

<cols>1500</cols>

<dt>f</dt>

<data>

...

</data>

</slope_y>

</opencv_storage>

其中data中为用科学记数法保留的float型变量。

使用MATLAB内置的xmlread函数读取XML文件,然后将数据保存到MAT文件中。matlab读取xml的代码如下:

% 读取XML文件

doc = xmlread('example.xml');

% 获取所有的slope_x和slope_y节点

slope_x_nodes = doc.getElementsByTagName('slope_x');

slope_y_nodes = doc.getElementsByTagName('slope_y');

% 获取节点的rows和cols

rows = str2double(slope_x_nodes.item(0).getElementsByTagName('rows').item(0).getTextContent());

cols = str2double(slope_x_nodes.item(0).getElementsByTagName('cols').item(0).getTextContent());

% 读取slope_x的数据

data_node = slope_x_nodes.item(0).getElementsByTagName('data').item(0);

data_str = char(data_node.getTextContent());

data_arr = sscanf(data_str, '%e');

slope_x = reshape(data_arr, [cols, rows])';

% 读取slope_y的数据

data_node = slope_y_nodes.item(0).getElementsByTagName('data').item(0);

data_str = char(data_node.getTextContent());

data_arr = sscanf(data_str, '%e');

slope_y = reshape(data_arr, [cols, rows])';

% 将数据保存到MAT文件中

save('example.mat', 'slope_x', 'slope_y');

解释:

1. 首先使用xmlread函数读取XML文件example.xml的内容,将其存储在doc变量中。

2. 通过doc对象的getElementsByTagName方法获取所有的slope_x和slope_y节点,并分别存储在slope_x_nodes和slope_y_nodes变量中。

3. 通过slope_x_nodes.item(0)获取第一个slope_x节点,然后通过getElementsByTagName方法获取其子节点rows和cols,并使用getTextContent方法获取其文本内容,最后使用str2double函数将其转换为数值类型并存储在rows和cols变量中。

4. 通过slope_x_nodes.item(0)获取第一个slope_x节点,然后通过getElementsByTagName方法获取其子节点data,使用getTextContent方法获取其文本内容并存储在data_str变量中。然后使用sscanf函数将其转换为数值类型并存储在data_arr变量中。最后使用reshape函数将data_arr变换为cols行rows列的矩阵,并使用'转置运算符将其转置,最终存储在slope_x变量中。

5. 通过slope_y_nodes.item(0)获取第一个slope_y节点,然后按照与步骤4相同的方式读取其数据并存储在slope_y变量中。

6. 最后使用save函数将slope_x和slope_y变量保存到MAT文件example.mat中。

猜你喜欢

转载自blog.csdn.net/Eason_Y/article/details/129790955