exponenta event banner

Обработка данных с помощью TLC

Параметры матрицы

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.

Параметры матрицы генератора кода

Форматирование внутреннего хранилища данных Simulink и генератора кода отличается от форматирования внутреннего хранилища данных MATLAB только хранением массивов сложных чисел. В MATLAB реальная и мнимая части хранятся в отдельных массивах. В продуктах Simulink и генератора кода они хранятся в «перемежающемся» формате, где числа в памяти чередуются вещественными, мнимыми, вещественными, мнимыми и так далее. Это соглашение позволяет эффективно реализовывать небольшие сигналы на линиях Simulink и для блоков Mux и других «виртуальных» блоков манипулирования сигналами (то есть они не активно копируют свои входы, просто ссылки на них).

Скомпилированный файл модели, model.rtw, представляет матрицы как строки в синтаксисе MATLAB без подразумеваемого формата хранения. Это позволяет скопировать строку из .rtw и вставьте его в код MATLAB и получите его распознавание MATLAB.

TLC объявляет параметры матрицы блока Simulink скалярными или 1-D переменными массива

real_T scalar; 
real_T mat[ nRows * nCols ];

где real_T может быть произвольным типом данных, поддерживаемым Simulink, и соответствовать типу переменной, заданному в файле модели.

Например, матрица 3 на 3 в блоке Look-Up Table (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;

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[nRows]" (автоматически оптимизирован из "[0+nRows*1]") и

LibBlockMatrixParameterAddr(OutputValues, "", "", 0, "", "", 1) прибыль "&model_P.s1_Look_Up_Table_2_D_Table[nRows]" как для встроенного, так и для неинлинированного блочного кода TLC.

Параметры матрицы аналогичны другим параметрам TLC. В структуру параметров помещаются только те параметры, к которым явно обращается функция библиотеки TLC во время генерации кода. Итак, следуя примеру, s1_Look_Up_Table_2_D_Table не объявляется, если LibBlockParameter или LibBlockParameterAddr явный доступ к нему.

Связанные темы