【问题标题】:Loading the data for a Simulink Lookup Table from a file从文件加载 Simulink 查找表的数据
【发布时间】:2023-04-06 09:55:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: matlab modeling lookup-tables simulink acoustics


    【解决方案1】:

    如果我理解正确,听起来您想要一个Lookup Table block,其中包含可以在模拟过程中动态更新的索引和表值。我相信您可以使用From File blockDemux blockLookup Table Dynamic block 来做到这一点。假设您有一个 .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 block 加载后,长度为2*N 的输出可以使用Demux block 拆分为两个长度为N 的输出(即索引和表值)。然后,这两个数组可用于Lookup Table Dynamic blockxdatydat 输入,从而创建一个查找表,其索引和表值可以在模拟运行时从文件中更新。

    对 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 block 的关注,您实际上不需要指定N。您只需要指定它将有 2 个输出,因此它将输入分成两半。例如,如果输入是一个 10 元素的向量,并且您为块指定了两个输出,那么您将得到两个 5 元素的向量作为输出。

    【讨论】:

    • 感谢新手。是的,这是方向,但我认为这里有两个问题。第一个问题是 From File 块似乎要求 .mat 数据采用 *time series 形式——我正在使用的数据表中没有时间概念,所以这将是人为添加这将需要一个额外的“胶水脚本”。我认为第二个问题是 Demux 块需要知道一个静态的 N 值,并且无法发现它(对吗?)目标是能够让 N 是动态的——在模拟运行时发现。
    • 又好又简单!这两个问题都解决了——这很好用。其实我觉得时序索引也应该解决基于时间的动态更新问题。 (我想到了另一种方法,所以在你上面详细说明之前错过了你的暗示。)谢谢;)
    • +1 是为了简单,+1 是为了澄清——这带来了价值。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢 MikeT——这适用于静态表,但不适用于动态表。我想避免使用启动脚本或工作区变量,因为这意味着必须在模拟之外使数据保持最新。理想的解决方案是能够在模拟运行期间以某种方式从文件中加载表数据。例如,这将允许环境参数(表格数据)在模拟运行时随时间缓慢演变。
    • 我误解了你的问题,我完全同意gnovice的建议,这是正确的做法。
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多