1.8.1 Numeric Data
This section gives examples of working with numeric data in Origin C. Numeric data can be stored in variables of the following data types:
- double
- integer
- vector
- matrix
Numeric data and strings can be stored in the nodes of a tree, provided the nodes have one of the data types above.
Note:Values such as 0.0, NANUM (missing value) and values between -1.0E-290 to 1.0E-290 will be evaluated to be False in logic statement.
Missing Values
As important as numeric data is, it is also important to be able to represent missing data. Origin C defines the NANUM macro for comparing and assigning values to missing data. Missing values are only supported with the double data type.
double d = NANUM;
if( NANUM == d )
out_str("The value is a missing value.");
Origin C also provides the is_missing_value function for testing if a value is a missing value.
if( is_missing_value(d) )
out_str("The value is a missing value.");
Numeric, Significant DigitsNumeric, Data Comparison DataPrecision and Comparison
In the following example code, the prec and round functions are used to control the precision of double type numeric data. The is_equal function is used to compare two pieces of double type numeric data.
double dVal = PI; // PI defined as 3.1415926535897932384626
// convert the double value to have 6 significant digits
int nSignificantDigits = 6;
printf("%f\n", prec(dVal, nSignificantDigits));
// force the double value to only have two decimal digits
uint nDecimalPlaces = 2;
double dd = round(dVal, nDecimalPlaces);
printf("%f\n", dd);
// compare two double values
if( is_equal(dd, 3.14) )
{
out_str("equal\n");
}
else
{
out_str("not equal\n");
}
Convert Numeric to StringNumeric, Convert to String
// assign int type numeric to string
string str = 10;
out_str(str);
int nn = 0;
str = nn;
out_str(str);
// convert double type numeric to string
double dd = PI;
str = ftoa(dd, "*"); // Use "*" for Origin's global setting in Options dialog
out_str(str);
str = ftoa(dd, "*8"); // Use "*8" for 8 significant
out_str(str);
VectorArray, One-Dimensional
// One-Dimensional array with basic data type, for example, double, int, string,
// complex.
vector vx, vy;
int nMax = 10;
vx.Data(1, nMax, 1); // assign value to vx from 1 to 10 with increment 1
vy.SetSize(nMax); // set size(10) to vy
for(int nn = 0; nn < nMax; nn++)
{
vy[nn] = rnd(); // assign random data to each item in vy
printf("index = %d, x = %g, y = %g\n", nn+1, vx[nn], vy[nn]);
}
// Access the data in a worksheet window
Worksheet wks = Project.ActiveLayer();
Column col(wks, 0);
vector& vec = col.GetDataObject();
vec = vec * 0.1; // Multiply 0.1 by each piece of data in vec
vec = sin(vec); // Find the sine of each piece of data in vec
MatrixArray, Two-Dimensionals
// Two-Dimensional array with basic data type, for example, double, int, complex,
// but not string.
matrix mat(5, 6);
for(int ii = 0; ii < 5; ii++)
{
for(int jj = 0; jj < 6; jj++)
{
mat[ii][jj] = ii + jj;
printf("%g\t", mat[ii][jj]);
}
printf("\n"); // new line
}
// Access the data in matrix window
MatrixLayer ml = Project.ActiveLayer();
MatrixObject mo = ml.MatrixObjects(0);
matrix& mat = mo.GetDataObject();
mat = mat + 0.1; // Add 0.1 for the each data in matrix
TreeNode
The Origin C TreeNode class provides several methods for constructing multi-level trees, traversing trees and accessing the value/attributes of tree nodes.
Tree tr;
// Access the value of a tree node
TreeNode trName = tr.AddNode("Name");
trName.strVal = "Jane";
tr.UserID.nVal = 10;
vector<string> vsBooks = {"C++", "MFC"};
tr.Books.strVals = vsBooks;
out_tree(tr); // output tree
ComplexComplex Variable
complex cc(1.5, 2.2);
cc.m_re = cc.m_re +1;
cc.m_im = cc.m_im * 0.1;
out_complex("cc = ", cc); // output cc = 2.500000+0.220000i
// Access complex dataset
Worksheet wks = Project.ActiveLayer();
Column col(wks, 1);
if( FSI_COMPLEX == col.GetInternalDataType() )
{
vector<complex>& vcc = col.GetDataObject();
vcc[0] = 0.5 + 3.6i;
}
// Access complex matrix
MatrixLayer ml = Project.ActiveLayer();
MatrixObject mo = ml.MatrixObjects();
if( FSI_COMPLEX == mo.GetInternalDataType() )
{
matrix<complex>& mat = mo.GetDataObject();
mat[0][0] = 1 + 2.5i;
}
DataRange
The DataRange class is a versatile mechanism to get and put data in a Worksheet, Matrix or Graph window.
Data Range in WorksheetWorksheet, Data Range SelectionData Range, from Worksheet
For a Worksheet, a data range can be specified by column/row index as one column, one row, any sub block range, one cell or entire Worksheet.
// Construct a data range on the active worksheet, all columns and rows
// from 1st row to 5th row.
Worksheet wks = Project.ActiveLayer();
int r1 = 0, c1 = 0, r2 = 4, c2 = -1;
DataRange dr;
// range name should be make sense, for example, "X", "Y",
// "ED"(Y error), "Z". If the data range is not belong to dependent
// or independent type, default can be "X".
dr.Add("X", wks, r1, c1, r2, c2);
Get data from data range to vector. DataRange::GetData supports multiple overloaded methods. For example:
vector vData;
int index = 0; // range index
dr.GetData(&vData, index);
Data Range in MatrixsheetMatrix Sheet, Data Range SelectionData Range, from Matrix
For a Matrix window, the data range can be a matrix object index.
MatrixLayer ml = Project.ActiveLayer();
DataRange dr;
int nMatrixObjectIndex = 0;
dr.Add(ml, nMatrixObjectIndex, "X");
Get data from data range to matrix.
matrix mat;
dr.GetData(mat);
Data Range in GraphGraph Layer, Data Range SelectionData Range, from Graph
For a Graph window, the data range can be one data plot, or a sub range of one data plot.
GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(); // Get active data plot
DataRange dr;
int i1 = 0; // from the first data point
int i2 = -1; // to the last data point
dp.GetDataRange(dr, i1, i2);
Get XY data from data plot to vector by data range object.
vector vx, vy;
DWORD dwRules = DRR_GET_DEPENDENT;
dr.GetData(dwRules, 0, NULL, NULL, &vy, &vx);
Data Range ControlData Selector
OriginC supports a GetN dialogGetN Data Selector Control interactive control to choose a data range.
#include <GetNBox.h>
// Open a dialog to choose a range from one graph data plot.
// And construct a data range object by this selection.
GETN_TREE(tr)
GETN_INTERACTIVE(Range1, "Select Range", "")
if( GetNBox(tr) ) // returns true if click OK button
{
DataRange dr;
dr.Add("Range1", tr.Range1.strVal);
vector vData;
int index = 0; // range index
dr.GetData(&vData, index); // The data in vData is the selected data points
}
|