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

###### Функции класса CmaMatrix

- CmaMatrix (maType type)
- CmaMatrix (maType type, CmaIndex& sizes)
- CmaMatrix(maType type,CmaIndex sizes,maString name,int maxSize)
- CmaMatrix (ImaMatrix *matrix)
- CmaMatrix (CmaCell &cell)
- ~CmaMatrix()
- void Resize(CmaIndex sizes)
- maType Type()
- int Dim()
- int Size(int dim)
- void Clear()
- CmaMatrix& operator[] (long i)
- CmaMatrix& operator[] (CmaIndex& idx)
- CmaMatrix& operator[] (CmaMatrixIterator& idx)
- operator double ()
- double AsDouble()
- int AsInt()
- maString AsString()
- double operator= (double rvalue)
- int operator= (int rvalue)
- maString operator= (maString rvalue)
- void SetEmpty()
- bool IsEmpty()
- void SetEmptyDoubleValue(double value)
- void SetEmptyStringValue(double value)
- void SetEmptyLongValue(int value)
- double GetEmptyDoubleValue()
- maString GetEmptyStringValue()
- int GetEmptyLongValue()
- void CacheMatrix(char cacheMode,CmaMatrix& source)
- void Commit()
- void StopCacheing()
- void SetConversionStrings(maConvertStrings strings)
- maConvertStrings GetConversionStrings()
- void ClearConversionStrings()

    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);
      }
    }