Класс наследует от CmaIndex способ формирования индекса для доступа к элементам матрицы. Он также переопределяет операторы преобразования типов и присваивания, чтобы сократить код записи и считывания значений в ячейках матрицы:
Функции класса CmaMatrix


CmaMatrix (maType type)
Создание новой, пустой матрицы с типом элементов type. Поле type может содержать комбинацию одного из флагов (MA_DOUBLE, MA_STRING, MA_BOOLEAN и MA_BYTE) для указания типа данных с флагами MA_SPARSE и MA_EVAL. О значение флагов смотри в описании интерфейса ImaMatrix.

Код ошибки:

MA_ERR_NOINTERFACE если не удалось создать компонент (не вызван CoInitialize() или не зарегистрирован maCom)
MA_ERR_NOMEMORY если не удалось выделить память для хранения данных
MA_ERR_ACCESS если запрещена запись в матрицу

CmaMatrix (maType type, CmaIndex& sizes)
Создание новой матрицы с типом элементов _type и размерами, заданными классом sizes. Поле type может содержать комбинацию одного из флагов (MA_DOUBLE, MA_STRING, MA_BOOLEAN и MA_BYTE) для указания типа данных с флагами MA_SPARSE и MA_EVAL. О значение флагов смотри в описании интерфейса ImaMatrix.

Код ошибки:

MA_ERR_NOINTERFACE если не удалось создать компонент (не вызван CoInitialize() или не зарегистрирован maCom)
MA_ERR_NOMEMORY если не удалось выделить память для хранения данных
MA_ERR_ACCESS если запрещена запись в матрицу

CmaMatrix(maType type,CmaIndex sizes,maString name,int maxSize);
Функция позволяет создавать и использовать матрицы, размещенные в разделяемой памяти.
  1. Если maxSize≠0, то создается разделяемая область памяти размером maxSize с именем name и данные матрицы размещаются в ней. Созданная матрица имеет размеры sizes и доступна для чтения и записи.


  2. Если maxSize=0, то создается матрица с данными, уже хранящимися в разделяемой памяти с именем name. Параметр sizes в этом случае не используется, размер матрицы берется из разделяемой памяти. Созданная матрица доступна только для чтения.

Код ошибки:

MA_ERR_NOINTERFACE если не удалось создать компонент (не вызван CoInitialize() или не зарегистрирован maCom)
MA_ERR_NOMEMORY если не удалось выделить память для хранения данных
MA_ERR_REPNAME При создании новой матрицы, если матрица с именем name уже существует
MA_ERR_BAD_CLSID если матрица с именем name имеет другой тип данных

CmaMatrix (ImaMatrix *matrix);
Присоединение класса к интерфейсу уже существующей матрицы.
CmaMatrix (CmaCell &cell);
Присоединение класса к интерфейсу матрицы, хранящейся в ячейке cell. Если в ней значение другого типа, то объект не создается.
~CmaMatrix();
Уменьшение числа ссылок на интерфейс Intf и уничтожение объекта.
void Resize(CmaIndex sizes);
Изменяет размер матрицы на новый, заданный массивом sizes. Все содержимое матрицы при этом теряется.

Код ошибки:

MA_ERR_ACCESS если запрещена запись в матрицу

maType Type();
Возвращает тип значений, хранящихся в матрице.
int Dim();
Функция возвращает размерность матрицы.
int Size(int dim);
Функция возвращает размер матрицы по dim-той размерности.
void Clear();
Функция очищает матрицу, заполняя ее пустыми значениями или значениями по умолчанию. Размеры матрицы не меняются.

Код ошибки:

MA_ERR_ACCESS если запрещена запись в матрицу

CmaMatrix& operator[] (long i);
Добавляет значение i к текущему индексу и возвращает *this. Это позволяет формировать индекс оператором вида "Matrix[2][10]=...".
CmaMatrix& operator[] (CmaIndex& idx);
Добавляет сформированный индекс idx к текущему индексу и возвращает *this.

Код ошибки:

MA_ERR_NOMEMORY если idx==NULL

CmaMatrix& operator[] (CmaMatrixIterator& idx);
Добавляет индекс текущего элемента итератора idx к текущему индексу и возвращает *this.

Код ошибки:

MA_ERR_NOMEMORY если idx==NULL

operator double ();
double AsDouble();
int AsInt();
maString AsString();
Функции считывают значения по текущему индексу. После вызова текущий индекс очищается.

Код ошибки:

MA_ERR_ACCESS если чтение из матрицы запрещено

double operator= (double rvalue);
int operator= (int rvalue);
maString operator= (maString rvalue);
Функции записывают значения по текущему индексу. После вызова текущий индекс очищается.

Код ошибки:

MA_ERR_ACCESS если запись в матрицу запрещена

Внимание!

Вместо функции AsString нельзя использовать operator maString(), так как запись Matrix[10][5] будет интерпретироваться неоднозначно
(как Matrix[10][5].operator maString()
или как (Matrix[10].operator maString())[5] )

В операторах вида Matrix1[i][j]=Matrix2[k];(в обоих частях присваивания стоят матрицы) выполняется копирование классов-оболочек (как в операторе Matrix1=Matrix2). Правильная запись такого оператора:
Matrix1[i][j]=(double)Matrix2[k]; или
Matrix1[i][j]=Matrix2[k].AsDouble;

Вещественные и строковые матрицы могут содержать "пустые" значения, которые используются, например, для обозначения пропусков в данных. При инициализации матрицы все ее элементы устанавливаются "пустыми". При пустого считывании значения выдается константа, задаваемая функциями SetEmptyDoubleValue, SetEmptyStringValue и SetEmptyLongValue для считывания свойств AsDouble, AsString и AsLong соответственно. Целочисленные и булевские матрицы не поддерживают пустые значения и при создании инициализируются нулями или значением false.
void SetEmpty();
Функция записывает в матрицу пустое значение. Если матрица не поддерживает пустые значения, то вызовы функции игнорируются.
bool IsEmpty();
Функция проверяет, будет ли значение ячейки матрицы пустым. Если матрица не поддерживает пустые значения, то функция возвращает false.
void SetEmptyDoubleValue(double value);
void SetEmptyStringValue(double value);
void SetEmptyLongValue(int value);
Функции устанавливают константы, которые играют роль "пустых" значений. Эти константы выдаются, если считываемое из матрицы значение пустое. Эти константы не являются глобальными и их можно изменять в процессе работы с матрицей, при этом пустые значения в матрице остаются пустыми.

По умолчанию эти константы равны NaN для чисел и пустая строка для строк.

Если матрица не поддерживает пустые значения, то вызовы функции игнорируются.


double GetEmptyDoubleValue();
maString GetEmptyStringValue();
int GetEmptyLongValue();
Функции возвращают константы, которые играют роль "пустых" значений.
void CacheMatrix(char cacheMode,CmaMatrix& source);
Функция позволяет использовать данную матрицу как буфер для матрицы source или отключить буферизацию, если source==NULL. При включении буферизации все данные в матрице уничтожаются и размер матрицы становится равным размеру source. Параметр cacheMode выбирает режим буферизации:
MA_CACHE_READ
Будет создан буфер для чтения и содержимое матрицы source будет прочитано в данную матрицу.


MA_CACHE_WRITE
Будет создан буфер для записи. При вызове функции Commit матрица source будет очищена и затем в нее будет записано содержимое данной матрицы.


MA_CACHE_WRITE_THROUGH
Будет создан буфер для записи. При каждой операции записи в данную матрицу значение сразу же будет скопровано и в матрицу source. Вызывать функцию Commit не нужно.


MA_CACHE_WRITE_APPEND
Будет создан буфер для записи. При вызове функции Commit все непустые элементы данной матрицы будут записаны в матрицу source.
Эта функция будет полезна при написании библиотек алгоритмов в методах, которые в процессе вычислений записывают данные во входные матрицы или считывают их из выходных матриц.

Код ошибки:

MA_ERR_NOMEMORY если при изменении размеров матрицы не удалось выделить память.

void Commit();
Функция передает данные в/из буферизуемой матрицы. Конкретное действие этой функции зависит от режима буферизации:
MA_CACHE_READ
Содержимое буферизуемой матрицы будет повторно прочитано в данную матрицу.


MA_CACHE_WRITE
Матрица source будет очищена и затем в нее будет записано содержимое данной матрицы.


MA_CACHE_WRITE_APPEND
Все непустые элементы данной матрицы будут записаны в матрицу source. Содержимое ячеек буферизуемой матрицы, соответствующх пустым элементам данной матрицы, не изменяется.

void StopCacheing();
Очищает указатель на буферизируемую матрицу и уменьшает число ссылок на нее. Эквивалентна вызову CacheMatrix(0,0).

void SetConversionStrings(maConvertStrings strings);

Функция устанавливает формат преобразования чисел в строки и обратно. Эти преобразования происходят при чтении данных другого типа, чем записанные в ячейке.
maConvertStrings GetConversionStrings();

Функция возвращает формат преобразования, используемый данной ячейкой.
void ClearConversionStrings();

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

Создание и заполнение двумерной числовой матрицы.

CmaIndex sz;
CmaMatrix X(MA_DOUBLE, sz[168][7]);
for (int i=0; i<X.Size(0); i++) {
  for (int j=0; j<X.Size(1); j++) {
    X[i][j] = double(i+j);
  }
}