我正在尝试使用Dymola的.mat结果进行数据处理。我的计划是使用MATLAB。我有几个关于.mat文件的问题:
- 如果我直接将.mat文件加载到MATLAB中,数据结构非常奇怪,我必须使用Dymola附带的MATLAB脚本来加载.mat文件。有关于数据如何存储在.mat文件中的解释吗
- 当用结果绘制图表时,我想更改单位,但我不确定如何让Dymola用我想要使用的单位输出数据。当Dymola将数据输出到.mat文件时,是否有任何设置允许我更改单位
关于文件格式,请注意,有一个实用程序可以将MAT文件转换为简单的基于HDF5的格式,如果这可以使后处理更容易的话。MATLAB和Python都有读取此类文件的脚本(扩展名SDF(。
如果您生成一个文本结果文件(它也可能在文档中的某个地方(,您可以获得结果文件的基本数据结构的解释,最相关的部分是:
Matrix with 4 columns defining the data of the signals:
dataInfo(i,1)= j: name i data is stored in matrix "data_j".
(1,1)=0, means that name(1) is used as abscissa
for ALL data matrices!
dataInfo(i,2)= k: name i data is stored in column abs(k) of matrix
data_j with sign(k) used as sign.
并且为了简化:最多有两个数据矩阵,用于所有数据矩阵的横坐标是"0";时间";。
- 您当前无法以特定单位直接输出垫子文件。但是,您可以使用特定的单位输出csv文件
这里简要介绍了Modelica Dymola创建的.mat文件的结构。但您应该知道的是,Dymola以这种方式将模拟变量保存在两个不同的mat文件变量中:
- 所有变量的名称和描述都保存在.mat文件中的两个不同的独立变量中,即
name
和description
- 如果一个变量有一个常数值,并且它的值不会随着时间的推移而改变(就像标量变量一样(,那么它会保存在.mat文件中的
data_1
变量中 - 否则,它将保存在.mat文件中的
data_2
变量中。保持这样的可变数据是我的Dymola在将模拟数据保存在大文件中的同时获得最佳性能的一种技术
要在不使用Dymola本身的情况下读取Dymola创建的这些mat文件,您可以使用MATIO等.mat阅读器库来读取数据,然后自己解释结果。
我不知道这是否仍然有趣,但我相信至少来自搜索引擎的人会对这个话题有所帮助。。。
我发现Dymola的所有这些转换和脚本都令人沮丧、讨厌和繁琐(为什么没有"导出值"按钮??(!
所以我写了一个简单的MATLAB脚本,每当我发现有值得导出的结果时,我都可以使用它。好处是,我想每个人都明白它在做什么。
% Read variables from multiple Dymola result files.
clc
clear
%% Parameters
% Path to Dymola conversion tool.
path_alist = 'D:sw3DSDymola 2021xbin64alist.exe';
% Path to the folder containing Dymola results.
folder_dymola = '...20_DymolaArbeitsordner';
% Result file names of Dymola, starred names allowed to select multiple.
filename_dymola = 'const.k = *.mat';
% Export MAT file path with all the Dymola results.
path_results = fullfile(folder_dymola, 'export_results.mat');
% Variable names to extract.
var_names = {
'model.forceGain.flange_b.f';
'model.armature.flange_a.s'
};
%% Read files and collect variables
% Find all results files.
files_result = {dir(fullfile(folder_dymola, filename_dymola)).name};
% Prepare conversion command.
cmd_1 = ['"' path_alist '" '];
for var_name = var_names'
cmd_1 = [cmd_1 '-e ' var_name{:} ' '];
end
cmd_2 = [' "' fullfile(folder_dymola, 'export.csv') '"'];
% Scan through all result files and save their content.
results = cell(length(files_result), 1);
for i = 1:length(files_result)
% Convert the result file to CSV with the requested variables.
system([cmd_1 '"' fullfile(folder_dymola, files_result{i}) '"' cmd_2]);
% Read the CSV file.
data = readmatrix(fullfile(folder_dymola, 'export.csv'));
% Save the data.
results{i} = data;
end
% Save the results.
header = ['Time' var_names'];
save(path_results, 'header', 'results');