Наиболее быстрый способ реализации метода — вывести его путем наследования из класса-полуфабриката CmaStdMethodDef, описанного в заголовочном файле maComBase.h. Следующий код показывает реализацию метода вычисления для алгоритма наименьших квадратов.
#include#include "maComClasses.h" #include "maComBase.h" // Метод вычисления в алгоритме наименьших квадратов class CLsmCalc : public CmaStdMethodDef { public: CLsmCalc () {}; virtual ~CLsmCalc(){ }; MA_INTERFUNC GetDescription (maString* descr); MA_INTERFUNC Init (ImaList*param, ImaReadList*input, ImaReadList*output); MA_INTERFUNC CalcDef (); MA_INTERFUNC CalcCellDef (int argno, maIndex index, ImaCell* cell); private: // ячейки матриц-аргументов CmaCell m_Sc_F, m_Sc_y, m_Coeff; }; // Функция возвращает спецификацию метода HRESULT CLsmCalc::GetDescription (maString* descr) { *descr = L"Calc Sc|F -> Sc|{y}"; return NOERROR; } // Функция инициализации метода HRESULT CLsmCalc::Init (ImaList*param, ImaReadList*input, ImaReadList*output) { CmaList Param = param; CmaReadList Input = input; CmaReadList Output = output; // ячейки матриц-аргументов запоминаются во время инициализации метода, // что повышает эффективность доступа к матрицам во время выполнения m_Sc_F = Input[L"Sc|F"]; m_Sc_y = Output[L"Sc|{y}"]; m_Coeff = Param[L"coeff"]; return NOERROR; } // Вычисление выходной матрицы целиком HRESULT CLsmCalc::CalcDef () { // получение параметров и аргументов CmaMatrix A = m_Sc_F; CmaMatrix y = m_Sc_y; CmaMatrix coeff = m_Coeff; // собственно вычисление int nSc = A.Size(0); // число строк матрицы A=Sc|F int nF = A.Size(1); // число столбцов матрицы A=Sc|F for (int i=0; i<nSc; i++) { double sum = 0.0; // вычисление линейной комбинации for (int j=0; j<nF; j++) sum += A[i][j] * coeff[j]; y[i] = sum; } return NOERROR; } // Вычисление одной ячейки выходной матрицы HRESULT CLsmCalc::CalcCellDef (int argno, maIndex index, ImaCell* cell) { // получение параметров и аргументов CmaMatrix A = m_Sc_F; CmaMatrix y = m_Sc_y; CmaMatrix coeff = m_Coeff; // собственно вычисление int i = index->idx[0]; int nF = A.Size(1); double sum = 0.0; for (int j=0; j<nF; j++) sum += A[i][j] * coeff[j]; // запись результата в ячейку if (cell) cell->SetAsDouble (sum); else y[i] = sum; return NOERROR; }