2010-09-28 2 views
4

Я построил модель Matlab/Simulink, которую я использую для моделирования производительности подводного роботизированного транспортного средства, которое использует акустику для различных функций навигации и локализации клавиш.Загрузка данных для таблицы поиска Simulink из файла

Поскольку характеристики изменения океана с сезонностью и геолокации, я хотел бы эти данные, чтобы быть динамически загружается в модель из файла ASCII данных (разделенных пробелом данных, организованных в виде строк и столбцов).

Simulink имеет несколько блоков Lookup Table Blocks, но ни один из них, похоже, не предоставляет опцию «читать из файла» напрямую. Необходимость использования редактора таблиц будет приводить модель в неправильном направлении.

Есть ли другой способ, возможно, использование Matlab для загрузки данных в Blockset из файла?

Для таблицы с 1-D, я искал что-то похожее на Matlab команды

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

AKE

ответ

1

Если я правильно понимаю, похоже, что вы хотите иметь Lookup Table block с индексами и табличными значениями, которые могут динамически обновляться в ходе моделирования. Я считаю, вы можете сделать это, используя From File block, Demux block и Lookup 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 можно разделить на два выхода, каждый из которых имеет длину N (то есть индексы и значения таблицы), используя Demux block. Эти два массива затем могут использоваться для входов xdat и ydat для Lookup Table Dynamic block, создавая таким образом таблицу поиска, значения индекса и таблицы которой могут обновляться из файла по мере запуска имитации.

Ответ на комментарий от 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-элементных вектора.

+0

Спасибо gnovice. Да, это направление, но я думаю, что здесь есть две проблемы. Первая проблема заключается в том, что из блока File, по-видимому, требуется, чтобы данные * .mat были в форме * временных рядов *, в таблицах данных, которые я использую, нет понятия времени, поэтому это будет искусственное дополнение, которое потребует дополнительного «склейка скрипта». Вторая проблема, которую я считаю, состоит в том, что блок Demux должен знать статическое значение N и не может его обнаружить (правильно?). Цель состоит в том, чтобы иметь N динамический - обнаруженный во время выполнения моделирования. –

+1

@AKE: Я обновил свой ответ, чтобы обсудить ваши вышеупомянутые проблемы. – gnovice

+0

приятно и просто! обе проблемы адресованы - это хорошо работает. На самом деле, я думаю, что временный индекс должен также решить проблему динамического обновления по времени. (Я имел в виду другой подход, так что пропустил ваш смысл до тех пор, пока вы не разработали выше.) Спасибо;) –

0

Данные таблицы могут быть переменной в рабочем пространстве MATLAB, и вы можете заполнить рабочей области, загрузив любой файл, который вы хотите, прежде чем запускать симуляцию. Таким образом, в вашем примере переменная A может использоваться как данные таблицы.

Напишите сценарий запуска, чтобы заполнить рабочее пространство перед запуском симуляции, в этом скрипте вы можете загружать данные из любого файла мата, который вы хотите.

+0

Thanks MikeT - это работает для статической таблицы, но не для динамической таблицы. Я бы хотел избежать использования сценариев запуска или переменных рабочего пространства, так как это означает, что необходимо поддерживать данные за пределами симуляции. Идеальное решение могло бы каким-то образом загрузить данные таблицы из файла во время выполнения моделирования. Это позволило бы, например, параметры окружающей среды (табличные данные) медленно развиваться во времени по мере запуска моделирования. –

+1

Я неправильно понял ваш вопрос, я полностью согласен с советом гновица, это правильный способ сделать это. – MikeT