Загрузка данных для таблицы поиска Simulink из файла
Я построил модель Matlab/Simulink, которую я использую, чтобы имитировать производительность подводного роботизированного транспортного средства, которое использует акустику для различных ключевых функций навигации и локализации.
Поскольку характеристики океана меняются в зависимости от сезонности и геолокации, я хотел бы, чтобы эти данные динамически загружались в модель из файла данных ASCII (данные, разделенные пробелами, организованные в строки и столбцы).
Simulink имеет несколько наборов блоков таблицы поиска, но ни один из них, похоже, не предоставляет опцию "чтение из файла" напрямую. Необходимость использования редактора таблиц приведет модель в неправильном направлении.
Есть ли другой способ, возможно, с помощью Matlab, чтобы загрузить данные в Blockset из файла?
Для 1-D таблицы я ищу что-то похожее на команды Matlab
A = load(filename)
A(:,1) % for the index
A(:,2) % for the table values
AKE
2 ответа
Если я правильно понимаю, похоже, что вы хотите иметь блок "Таблица поиска" с индексом и значениями таблицы, которые можно динамически обновлять в ходе моделирования. Я полагаю, что вы можете сделать это, используя блок From File, блок Demux и динамический блок Lookup Table. Допустим, у вас есть файл.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, вывод длины 2*N
может быть разделен на два выхода каждый длиной N
(т.е. индексы и табличные значения) с использованием блока Demux. Эти два массива могут быть использованы для xdat
а также ydat
вводит данные в динамический блок "Таблица поиска", создавая, таким образом, справочную таблицу, индексы и значения которой можно обновлять из файла по мере выполнения моделирования.
Ответ на комментарий от 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 элементов.
Табличные данные могут быть переменной в рабочем пространстве MATLAB, и вы можете заполнить рабочее пространство, загрузив любой файл, который вы хотите, перед запуском моделирования. Так что в вашем примере переменная A может использоваться в качестве данных таблицы.
Напишите сценарий запуска, чтобы заполнить ваше рабочее пространство перед запуском симуляции, в этом сценарии вы можете загрузить данные из любого файла с матами, который вам нужен.