4

我已经构建了一个 Matlab/Simulink 模型,我用它来模拟水下机器人车辆的性能,该机器人使用声学来实现各种关键导航和定位功能。

由于海洋的特征随着季节性和地理位置而变化,我希望这些数据能够从 ASCII 数据文件(按行和列组织的空间分隔数据)动态加载到模型中。

Simulink 有许多查找表模块集,但它们似乎都没有直接提供“从文件读取”选项。不得不使用表格编辑器会使模型走错方向。

是否有另一种方法,可能使用 Matlab,将数据从文件加载到 Blockset 中?

对于一维表,我正在寻找类似于 Matlab 命令的东西

A = load(filename)
A(:,1)  % for the index
A(:,2)  % for the table values

AKE

4

2 回答 2

1

如果我理解正确,听起来您想要一个带有索引和表值的Lookup Table 块,可以在模拟过程中动态更新。我相信您可以使用From File 块Demux 块Lookup Table Dynamic 块来做到这一点。假设您有一个 .mat 文件,其中包含以下形式的数组:

[  time_1   time_2   time_3 ...;  %# Time stamps
 index1_1 index1_2 index1_3 ...;  %# Index 1 for all time stamps
 index2_1 index2_2 index2_3 ...;  %# Index 2 for all time stamps
 ...
 indexN_1 indexN_2 indexN_3 ...;  %# Index N for all time stamps
 value1_1 value1_2 value1_3 ...;  %# Table value 1 for all time stamps
 value2_1 value2_2 value2_3 ...;  %# Table value 2 for all time stamps
 ...
 valueN_1 valueN_2 valueN_3 ...]  %# Table value N for all time stamps

对于每一列,都有一个时间戳、N查找表索引的N元素和表值的元素。使用From File 块加载后,可以使用Demux 块2*N将长度的输出拆分为每个长度的两个输出N(即索引和表值)。然后,这两个数组可用于Lookup Table Dynamic 模块的和输入,从而创建一个查找表,其索引和表值可以在仿真运行时从文件中更新。xdatydat

对AKE评论的回应......

时间戳存在于上述数组中,因为我的印象是您希望将查找表数据更改为模拟时间的函数(例如,使用一组索引和表值 0 到 10 秒,然后使用另一组10 到 20 秒)。如果您想这样做,则需要指定更改数据的时间。

但是,如果您只想在模拟开始时从文件中加载组表数据,那么您的 .mat 文件应该只需要一个时间戳为 0 的列。您的示例数据可以相应地轻松修改:A

A = load(yourDataFile);  %# Load your data 
A = [0; A(:)];           %# Convert it to a column vector and add a time stamp
save(yourMatFile,'A');   %# Save A to a .mat file for the From File block

关于您对Demux 块的关注,您实际上不需要指定N. 您只需要指定它将有 2 个输出,因此它将输入分成两半。例如,如果输入是一个 10 元素向量,并且您为模块指定了两个输出,那么您将获得两个 5 元素向量作为输出。

于 2010-09-29T03:28:56.777 回答
0

表数据可以是 MATLAB 工作区中的变量,您可以通过在运行仿真之前加载所需的任何文件来填充工作区。因此,在您的示例中,变量 A 可以用作表数据。

在运行模拟之前编写一个启动脚本来填充您的工作区,在该脚本中,您可以从您想要的任何 mat 文件中加载数据。

于 2010-09-29T02:16:33.417 回答