3.9.2.2.6 Fit with matrix

Version Info

Minimum Origin Version Required: Origin 8.0 SR0

Before running

The following code shows how to use NLFit to fit matrix data.

1. Open a matrix from <Origin Installation Directory>\Samples\Matrix Conversion and Gridding\2D Gaussian.ogm.
2. Copy and compile the following codes in Code Builder, and then run below matrix_fit function in Command Window.

Example

#include <FDFTree.h>
#include <ONLSF.h>
#include <wks2mat.h>
bool matrix_fit()
{
// Get Matrix Object data into matrix
MatrixLayer ml = Project.ActiveLayer();
if( !ml )
return false;
MatrixObject mo = ml.MatrixObjects(0);
matrix mat = mo.GetDataObject();

// Get X and Y minimum and maximum respectively
// and then gerenate X and Y vectors for the same size of matrix
double xmin, ymin, xmax, ymax;
mo.GetXY(xmin, ymin, xmax, ymax);
int nCols = mat.GetNumCols();
int nRows = mat.GetNumRows();
vector vX(nCols*nRows), vY(nCols*nRows);
// Get X and Y vectos by equi-spaced gridding with specified minimum and maximum
ocmath_mat_to_regular_xyz(NULL, nRows, nCols, xmin, xmax, ymin, ymax, vX, vY, NULL, true);

// Load function from FDF file to tree
string strFDF = okutil_get_origin_path(ORIGIN_PATH_SYSTEM, "FitFunc") + "Gauss2D.FDF";
Tree trFF;
if(!nlsf_FDF_to_tree(strFDF, &trFF))
return false;

// NLFit object
NLFit fit;
// Set function
if( fit.SetFunction(trFF) < 0 ) // If error
return false;

// Set data
NLSFONEDATA arrstDep; // Dependent
arrstDep.pdData = mat;
arrstDep.nSize = nRows*nCols;

NLSFONEDATA arrstIndep[2]; // Independents, here are two, X and Y
arrstIndep[0].pdData = vX;
arrstIndep[0].nSize = vX.GetSize();
arrstIndep[1].pdData = vY;
arrstIndep[1].nSize = vY.GetSize();
if( 0 != fit.SetData(1, &arrstDep, arrstIndep) ) // 0 means OK
return false;

// Run parameter init code to get parameter init values
vector vZ;
mat.GetAsVector(vZ, true);  // Convert the matrix to vector
NumericFunction NF;
NF.SetTree(trFF);
vector vParameters;  // z0, A, xc, w1, yc, w2
if( !NF.ParamInit(vParameters, vX, vY, vZ) )  // Initialize
return false;

// Output patatmer init values
out_str("--- Paramter init values --- ");
for(int ii = 0; ii < vParameters.GetSize(); ii++)
{
printf("param index = %d value is  = %1f\n", ii, vParameters[ii]);
}

// Set paremter values
if( 0 != fit.SetParams(vParameters.GetSize(), vParameters) ) // 0 means OK
return false;

// Perform fitting
int nMaxNumIterations = 100;
fit.Fit(nMaxNumIterations);

// Output the fitted parameter results
out_str("--- Paramter result values --- ");
for(ii = 0; ii < vParameters.GetSize(); ii++)
{
printf("param index = %d value is  = %1f\n", ii, vParameters[ii]);
}
return true;
}