Компонент предназначен для выделения подматрицы из уже существующей матрицы, называемой родительской (Parent).
Компонент с интерфейсом ImaSubmatrix имеет также интерфейс ImaMatrix для доступа к созданой подматрице. При использовании этого интерфейса для чтения или записи данных происходит преобразование индекса ячейки, заданное с помощью фукнций интерфейса ImaSubmatrix, и затем выполняется запись или считывание в/из родительской матрицы по преобразованному индексу.
Преобразование индекса
Преобразование проводится отдельно для каждой размерности в индексе элемента подматрицы. Каждой размерности подматрицы сопоставлена размерность родительской матрицы, в которую она отображается. Далее каждой размерности может быть сопоставлена таблица преобразования: i-й элемент в ней есть номер элемента родительской матрицы, которому соответствует i-й элемент данной размерности подматрицы. Например, если размерность 0 подматрицы отображается в размерность 1 родительской матрицы и таблица преобразования - (3,2,0,5,...), то индексам (0,*,*) и (3,*,*) подматрицы соответствует индексы (*,3,*) и (*,5,*) соответственно.
Некоторые размерности родительской матрицы могут не быть сопоставлены ни одной размерности подматрицы. Такие размерности называются фиксированными и координата по этой размерности задается заранее.
Пример. Пусть родительская матрица имеет размеры 8х9х10 и в подматрице задано преобразование индекса:

- размерности 0 родительской матрицы сопоставлена размерность 1 подматрицы, таблица преобразования не задана
- размерности 1 родительской матрицы сопоставлена размерность 0 подматрицы, таблица преобразования (9,6,3,0)
- размерность 2 родительской матрицы фиксирована и равна 5

Тогда подматрица будет иметь размер 4х8 и между ее элементами и элементами родительской матрицы будут следующие соответствия:

- (0,0) - (0,9,5)
- (1,2) - (2,6,5)
- (3,6) - (6,0,5)

и так далее.

- SetParent([in] ImaMatrix* par)
- GetParent([out,retval] ImaMatrix** par)
- ClearStructure()
- VerifyStructure()
- SetDim([in] int parentDim,[in] int dim,[in] int size,[in] int* index)
- FixDim([in] int parentDim,[in] int index)
- SetIdentityDim([in] int dim)

    HRESULT SetParent([in] ImaMatrix* par)

Функция позволет установить родительскую матрицу для подматрицы. При вызове также сбрасывается преобразование индекса.

Параметры:

par указатель на родительскую матрицу

Возвращаемое значение:

MA_NOERROR всегда

    HRESULT GetParent([out,retval] ImaMatrix** par)

Функция позволет прочитать указатель на родительскую матрицу.

Параметры:

par указатель на возвращаемую родительскую матрицу

Возвращаемое значение:

MA_NOERROR при отсутствии ошибок
MA_ERR_BAD_PARAM если par==NULL

    HRESULT ClearStructure()

Сбрасывает преобразование индекса так, что преобразование индекса не производится.

Возвращаемое значение:

MA_NOERROR всегда

    HRESULT VerifyStructure()

Функция проверяет правильность задания преобразования: каждой незафиксированной размерности родительской матрицы должна соответствовать размерность в подматрице.

Возвращаемое значение:

MA_NOERROR при отсутствии ошибок
MA_ERR_VERIFY при несформированном преобразовании

    HRESULT SetDim([in] int parentDim,[in] int dim,[in] int size,[in] int* index)

Функция устанавливает соответствие между размерностью parentDim родительской матрицы и размерностью dim подматрицы.
Если size=0, то таблица преобразования и аргумент index не используется.
Если size≠0 и index=0, то таблица преобразования берется из ранее заданного соответствия с тем же parentDim и длина этой таблицы (и размер подматрицы по размерности dim) устанавливается равным size.
Если size≠0 и index≠0, то таблица преобразования задается параметром index и длина этой таблицы (и размер подматрицы по размерности dim) устанавливается равным size. При этом таблица преобразования не копируется и все изменения массива index будут влиять на преобразование индексов.

Параметры:

parentDim размерность родительской матрицы, которой будет соответствовать размерность dim в подматрице
dim изменяемая размерность в подматрице
size длина таблицы преобразования или 0, если таблица не используется
index не используется, если size==0; таблица преобразования или NULL, если size≠0

Возвращаемое значение:

MA_NOERROR при отсутствии ошибок
MA_ERR_BAD_PARAM если parentDim или dim больше размерности соответственно родительской и данной матрицы
MA_ERR_NOTFOUND если size≠0, index=0 и таблица преобразования для размерности dim не была задана ранее

    HRESULT FixDim([in] int parentDim,[in] int index)

Функция фиксирует размерность parentDim родительской матрицы и делает ее равной index.

Параметры:

parentDim фиксируемая размерность родительской матрицы
index фиксируемая координата по размерности parentDim родительской матрицы

Возвращаемое значение:

MA_NOERROR при отсутствии ошибок
MA_ERR_BAD_PARAM если parentDim больше, чем размерность родительской матрицы

Замечание:

    HRESULT SetIdentityDim([in] int dim)

Функция увеличивает размерность подматрицы, добавляя размерность длины 1.

Параметры:

dim номер добавляемой размерности. При добавлении существующие размерности dim, dim+1,dim+2... "сдвигаются" на одну, сохраняя соответствия с размерностями родительской матрицы

Возвращаемое значение:

MA_NOERROR всегда