MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   从文件加载Simulink查找表的数据 (https://www.labfans.com/bbs/showthread.php?t=23947)

poster 2019-12-10 20:48

从文件加载Simulink查找表的数据
 
我建立了一个Matlab / Simulink模型,用于模拟水下机器人车辆的性能,该车辆使用声学技术来实现各种关键的导航和定位功能。

由于海洋的特征随季节和地理位置的变化而变化,因此我希望将此数据从ASCII数据文件(以行和列组织的空间分隔数据) [B]动态加载到模型中[/B] 。

Simulink具有许多“查找表”块集,但它们似乎都没有直接提供“从文件读取”选项。必须使用表编辑器会使模型朝错误的方向发展。

是否存在另一种方式(也许使用Matlab)将数据从文件加载到模块集中?

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

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



[B]回答:[/B]

如果我理解正确,这听起来像您想要一个包含索引和表值的“ [URL="http://www.mathworks.com/help/toolbox/simulink/slref/lookuptable.html"]查找表”块[/URL] ,该[URL="http://www.mathworks.com/help/toolbox/simulink/slref/lookuptable.html"]块[/URL]可以在模拟过程中动态更新。我相信您可以使用[URL="http://www.mathworks.com/help/toolbox/simulink/slref/fromfile.html"]From File块[/URL] , [URL="http://www.mathworks.com/help/toolbox/simulink/slref/demux.html"]Demux块[/URL]和[URL="http://www.mathworks.com/help/toolbox/simulink/slref/lookuptabledynamic.html"]Lookup Table Dynamic块执行此操作[/URL] 。假设您有一个.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元素用于表值。使用“ [URL="http://www.mathworks.com/help/toolbox/simulink/slref/fromfile.html"]从文件”块[/URL]加载后,可以使用[URL="http://www.mathworks.com/help/toolbox/simulink/slref/demux.html"]Demux块[/URL]将长度为2*N的输出拆分为两个长度为N输出(即索引和表值)。然后可以将这两个数组用于[URL="http://www.mathworks.com/help/toolbox/simulink/slref/lookuptabledynamic.html"]Lookup Table Dynamic块[/URL]的xdat和ydat输入,从而创建一个查找表,其索引和表值可以在模拟运行时从文件中更新。

[I]回应AKE的评论...[/I]

时间戳出现在上面的数组中,因为我印象中您想根据模拟时间来更改查找表数据(例如,使用一组索引和表值设置0到10秒,然后使用另一组索引和表值) 10至20秒)。如果要执行此操作,则[I]需要指定[/I]一些更改数据的时间。

但是,如果您只想[I]在模拟开始时[/I]从文件[I]中[/I]加载[I]一[/I]组表数据,则您的.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 关于对[URL="http://www.mathworks.com/help/toolbox/simulink/slref/demux.html"]Demux块的[/URL]关注,实际上您不需要指定N您只需要指定它将有2个输出,就可以将输入一分为二。例如,如果输入是10个元素的向量,并且为该块指定了两个输出,则将获得两个5个元素的向量作为输出。



[url=https://stackoverflow.com/questions/3814737]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 23:25

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.