Main Content

Direct Lookup Table Algorithm for Row-Major Array Layout

This example shows how Simulink® selects a vector or a 2-D matrix from table data. In a 2-D table, the output vector can be a column or a row depending on the model configuration setting Use algorithms optimized for row-major array layout. In this example, the Direct Lookup Table algorithm is optimized for row-major array layout. The Direct Lookup Table algorithm that is optimized for column-major array layout is also presented as a reference. The code generated by using row-major interpolation algorithm performs with the best speed and memory usage when operating on table data with row-major array layout. The code generated by using column-major algorithm performs best with column-major array layout.

In this example, you:

  • Output a vector or a plane by using direct lookup with a column-major or a row-major algorithm.

  • Preserve semantics when switching from a column-major algorithm to a row-major algorithm.

  • Generate code by using a row-major algorithm and an array layout.

Simulate by Using Row-Major Algorithm — Output a Vector from 3-D Table

Open example models RowDLUT3DSelectVector and ColumnDLUT3DSelectVector.

  open_system('RowDLUT3DSelectVector');
  open_system('ColumnDLUT3DSelectVector');

1. By default, Simulink configures a model with column-major algorithm and column-major array layout. The model ColumnDLUT3DSelectVector is preconfigured to use column-major algorithms. Simulate the model and observe the output stored in workspace variable yout.

2. To enable row-major algorithms, open the Configuration Parameters dialog box. On the Math and Data Types pane, select the configuration parameter Use algorithms optimized for row-major array layout Alternatively, in the MATLAB® Command Window, enter:

set_param('ColumnDLUT3DSelectVector','UseRowMajorAlgorithm','on');

3. On the Simulation tab, click Run to simulate the model. Observe the change in output dimension and numeric values logged in workspace variable yout.

The column-major and row-major algorithms differ semantically in the selection of output vector. For example, in a 2-D table, Simulink selects a column vector as output for column-major algorithm and a row vector for row-major algorithm. In a table with a 3-D or higher dimension, Simulink selects the output vector from the first dimension of the table for a column-major algorithm and from the last dimension of the table for a row-major algorithm. The elements of the selected vector are contiguous in the table storage memory. In this example, the last dimension is the third dimension of the 3-D table. Due to semantic change, column-major and row-major direct lookup table algorithms output different vector size and numeric values.

These illustrations compare the vector output of row-major and column-major direct lookup table algorithms in a 3-D table.

Preserve Semantics by Using Table Permutation

For a direct lookup table that outputs a vector or 2-D matrix, the model semantics change when you switch from a column-major algorithm to a row-major algorithm. To preserve the semantics or ensure the same output given the same block I/O connections, you must permute the table data. Otherwise, Simulink propagates incorrect dimensions to downstream blocks.

1. The block ColumnDLUT3DSelectVector/Direct Lookup Table (n-D) has 3-D table data T3d = reshape([1:24], 3,2,4) and two input ports with value 0 and 1 (both are 0-based indices). The selected output vector is T3d(:,1,2) (1-based index) for a column-major algorithm. To preserve the semantics for a row-major algorithm on the same model, that is, select the same vector with same index port inputs, permute the table as T3d_p = permute(T3d, [2,3,1]). For a row-major algorithm, the selected vector is T3d_p(1,2,:).

T3d_str = get_param('ColumnDLUT3DSelectVector/Direct Lookup Table (n-D)','Table');
set_param('ColumnDLUT3DSelectVector/Direct Lookup Table (n-D)','Table',...
['permute(',T3d_str,',[2,3,1])']);

2. When you import table data from a file, you must permute the table data in the file before importing it. This permutation keeps the table tunable throughout the simulation and code generation workflow.

Code Generation by Using Row-Major Algorithm and Array Layout

After permuting the table data, Simulink configures the model ColumnDLUT3DSelectVector for row-major simulation. The model is equivalent to the preconfigured model RowDLUT3DSelectVector that has permuted table data and uses a row-major algorithm.

1. To set up these models for row-major code generation, open the Configuration Parameters dialog box. In addition to enabling the Use algorithms optimized for row-major array layout configuration parameter, on the Code Generation > Interface pane, set the configuration parameter Array layout to the Row-Major option. This configuration parameter enables the model for row-major code generation. Alternatively, in the MATLAB Command Window, enter:

% For model 'ColumnDLUT3DSelectVector'
set_param('ColumnDLUT3DSelectVector', 'ArrayLayout','Row-major');
% For model 'RowDLUT3DSelectVector'
set_param('RowDLUT3DSelectVector', 'ArrayLayout','Row-major');

2. In the Direct Lookup Table (n-D) block dialog box, examine the permuted 3-D table data.

3. Change your current folder in MATLAB to a writable folder. On the C Code tab, click Build to generate C code. In the generated code, the memcpy function replaces the for loops. Using memcpy reduces the amount of memory for storing data. This optimization improves execution speed.

Simulate by Using Row-Major Algorithm — Output a Plane from 3-D Table

open_system('RowDLUT3DSelectPlane');
open_system('ColumnDLUT3DSelectPlane');

1. Open the example model RowDLUT3DSelectPlane that outputs a plane or 2-D matrix from a 3-D table.

2. Simulate and generate code from the model by repeating the steps performed on ColumnDLUT3DSelectVector. The row-major and column-major direct lookup algorithms that output a 2-D matrix from a 3-D table are illustrated here.

close_system('RowDLUT3DSelectVector',0);
close_system('ColumnDLUT3DSelectVector',0);
close_system('RowDLUT3DSelectPlane',0);
close_system('ColumnDLUT3DSelectPlane',0);

Related Topics