MATLAB®, Simulink®, и генератор кода использует упорядоченное расположение больших столбцов для хранения массивов (1-D, 2-D,...). Доступ к следующему элементу массива в памяти осуществляется путем увеличения первого индекса массива. Например, эти пары элементов хранятся последовательно в памяти: A(i)
и A(i+1)
, B(i,j)
и B(i+1,j)
, C(i,j,k)
и C(i+1,j,k)
. Для получения дополнительной информации о внутреннем представлении данных MATLAB, см. MATLAB Data.
Форматирование внутреннего хранилища данных Simulink и генератора кода отличается от форматирования внутреннего хранилища данных MATLAB только хранением комплексных массивов чисел. В MATLAB действительная и мнимая части хранятся в отдельных массивах. В продуктах Simulink и генератора кода они хранятся в «перемеженном» формате, где числа в памяти чередуются реальными, мнимыми, реальными, мнимыми и так далее. Эта конвенция позволяет эффективно реализовывать маленькие сигналы на линиях Simulink и для блоков Mux и других «виртуальных» блоков манипуляции сигналами (то есть они не активно копируют свои входы, просто ссылки на них).
Скомпилированный файл модели,
, представляет матрицы как строки в синтаксисе MATLAB, без подразумеваемого формата памяти. Это позволяет скопировать строку из model
.rtw.rtw
файл и вставить его в код MATLAB и иметь его распознавание MATLAB.
TLC объявляет Блок Simulink параметры матрицы как скаляр или 1-D переменные массива
real_T scalar; real_T mat[ nRows * nCols ];
где real_T
может быть произвольным типом данных, поддерживаемым Simulink, и совпадать с типом переменной, заданным в файле модели.
Для примера матрица 3 на 3 в блоке Интерполяционная таблица (2-D)
1 2 3 4 5 6 7 8 9
хранится в
какmodel
.rtw
Parameter { Name "OutputValues" Value Matrix(3,3) [[1.0, 2.0, 3.0]; [4.0, 5.0, 6.0]; [7.0, 8.0, 9.0];] String "t" StringType "Variable" ASTNode { IsNonTerminal 0 Op SL_NOT_INLINED ModelParameterIdx 3 } }
и приводит к этому определению в model
.h
typedef struct Parameters_tag { real_T s1_Look_Up_Table_2_D_Table[9]; /* Variable:s1_Look_Up_Table_2_D_Table * External Mode Tunable:yes * Referenced by block: * <S1>/Look-Up Table (2-D */ [ ... other parameter definitions ... ] } Parameters;
The
файл объявляет фактическое хранилище для матричного параметра, и можно увидеть, что формат является основным столбцом. То есть считывайте столбцы вниз, затем поперек строк.model
.h
Parameters model_P = { /* 3 x 3 matrix s1_Look_Up_Table_2_D_Table */ { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 }, [ ... other parameter declarations ...] };
TLC обращается к параметрам матрицы через LibBlockMatrixParameter
и LibBlockMatrixParameterAddr
, где
LibBlockMatrixParameter(OutputValues, "", "", 0, "",
"", 1)
возвращает "
(автоматически оптимизировано из model
_P.s1_Look_Up_Table_2_D_Table[<reservedrangesplaceholder0 >
]""[0
) и+ nRows
*1]"
LibBlockMatrixParameterAddr(OutputValues, "", "",
0, "", "", 1)
возвращает "&
для inlined и nonlined блочного TLC кода.model
_P.s1_Look_Up_Table_2_D_Table[<reservedrangesplaceholder0 >
]"
Матричные параметры аналогичны другим параметрам TLC. В структуру параметров помещаются только те параметры, к которым явно обращается функция библиотеки TLC во время генерации кода. Итак, следуя примеру, s1_Look_Up_Table_2_D_Table
не объявляется, если только LibBlockParameter
или LibBlockParameterAddr
явный доступ к нему.