数値データ
このセクションでは、Origin Cで数値データを操作するサンプルを扱います。数値データは次のデータタイプの変数に保存することができます。
- double
- integer
- vector
- matrix
数値データと文字列は、ツリーのノードに保存でき、提供されたノードは上記のデータ型の1つです。
Note:0.0、NANUM (欠損値)、-1.0E-290 から 1.0E-290の間の値は、ロジカル文では偽 と評価されます。
欠損値
数値データが重要であるのと同様に、欠損値を表すことができることも重要です。 Origin Cは、値が欠損値であるかどうかを比較するNANUMマクロを定義します。 欠損値は、double型のデータ型のみをサポートしています。
double d = NANUM;
if( NANUM == d )
out_str("The value is a missing value.");
Origin Cは、値が欠損値であるかどうかをチェックするis_missing_value 関数も提供しています。
if( is_missing_value(d) )
out_str("The value is a missing value.");
Numeric, Significant DigitsNumeric, Data Comparison Data精度と比較
次のサンプルコードでは、prec と round 関数を使って、double型の数値データの精度を制御します。 is_equal 関数を使って、double型の数値データの2つを比較します。
double dVal = PI; // PI は、3.1415926535897932384626と定義
// double型の値を有効桁数6ケタに変換
int nSignificantDigits = 6;
printf("%f\n", prec(dVal, nSignificantDigits));
// double型の値を2ケタのみにする
uint nDecimalPlaces = 2;
double dd = round(dVal, nDecimalPlaces);
printf("%f\n", dd);
// 2つのdouble型の値を比較
if( is_equal(dd, 3.14) )
{
out_str("equal\n");
}
else
{
out_str("not equal\n");
}
数値を文字列に変換するNumeric, Convert to String
// int型の数値を文字列に割り当て
string str = 10;
out_str(str);
int nn = 0;
str = nn;
out_str(str);
// double型の数値を文字列に割り当て
double dd = PI;
str = ftoa(dd, "*"); // オプションダイアログでOriginのグローバル設定に"*"を使う
out_str(str);
str = ftoa(dd, "*8"); // "*8"を使用して有効桁数8ケタに指定
out_str(str);
ベクトルArray, One-Dimensional
// 基本データ型、例えば double, int, string, complexの
// 一次配列
vector vx, vy;
int nMax = 10;
vx.Data(1, nMax, 1); // 1から10まで増分1で値をvxに割り当て
vy.SetSize(nMax); // サイズ(10)をvyにセット
for(int nn = 0; nn < nMax; nn++)
{
vy[nn] = rnd(); // 乱数をvyの各項目に割り当て
printf("index = %d, x = %g, y = %g\n", nn+1, vx[nn], vy[nn]);
}
// ワークシート内のデータにアクセス
Worksheet wks = Project.ActiveLayer();
Column col(wks, 0);
vector& vec = col.GetDataObject();
vec = vec * 0.1; // vec内の各データに0.1を乗算
vec = sin(vec); // vec内のデータのsinを求める
行列Array, Two-Dimensionals
// 基本データ型、例えば double, int, complexの2次配列
// 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"); // 新しいライン
}
// 行列ウィンドウ内のデータにアクセス
MatrixLayer ml = Project.ActiveLayer();
MatrixObject mo = ml.MatrixObjects(0);
matrix& mat = mo.GetDataObject();
mat = mat + 0.1; // 行列の各データに0.1を加算
TreeNode
Origin CのTreeNodeクラスは、複数レベルのツリーを構築し、ツリーを横断し、ツリーノードの値/属性にアクセスするいくつかのメソッドを提供します。
Tree tr;
// ツリーノードの値にアクセス
TreeNode trName = tr.AddNode("Name");
trName.strVal = "Jane";
tr.UserID.nVal = 10;
vector<string> vsBooks = {"C++", "MFC"};
tr.Books.strVals = vsBooks;
out_tree(tr); // ツリーを出力
複素数Complex 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); // cc = 2.500000+0.220000i
// 複素数データセットにアクセス
Worksheet wks = Project.ActiveLayer();
Column col(wks, 1);
if( FSI_COMPLEX == col.GetInternalDataType() )
{
vector<complex>& vcc = col.GetDataObject();
vcc[0] = 0.5 + 3.6i;
}
// 複素数行列にアクセス
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
DataRange クラスは、ワークシート、行列、グラフウィンドウでデータを取得したり、配置する広範なメカニズムを提供します。
ワークシート内のデータ範囲Worksheet, Data Range SelectionData Range, from Worksheet
ワークシートに対しては、データ範囲は、1列、1行、部分範囲、1つのセル、ワークシート全体として列と行のインデックスを指定することができます。
// アクティブワークシートの1行目から5行目までのすべての列と行の
// データ範囲を構築
Worksheet wks = Project.ActiveLayer();
int r1 = 0, c1 = 0, r2 = 4, c2 = -1;
DataRange dr;
// 範囲名は"X", "Y"
// "ED"(Yエラー), "Z"のようなわかりやすいものにする。
データ範囲は、従属または独立のデータ型に属さなければ
// デフォルトは "X"
dr.Add("X", wks, r1, c1, r2, c2);
データ範囲からvectorにデータを取得します。DataRange::GetData は、複数のオーバーロードしたメソッドをサポートします。例えば、
vector vData;
int index = 0; // 範囲インデックス
dr.GetData(&vData, index);
行列シート内のデータ範囲Matrix Sheet, Data Range SelectionData Range, from Matrix
行列ウィンドウに対しては、データ範囲は行列オブジェクトインデックスにすることができます。
MatrixLayer ml = Project.ActiveLayer();
DataRange dr;
int nMatrixObjectIndex = 0;
dr.Add(ml, nMatrixObjectIndex, "X");
データ範囲からmatrixにデータを取得します。
matrix mat;
dr.GetData(mat);
グラフ内のデータ範囲Graph Layer, Data Range SelectionData Range, from Graph
グラフウィンドウに対して、データ範囲はデータプロットの1つまたは1つのデータプロットの部分範囲にすることができます。
GraphLayer gl = Project.ActiveLayer();
DataPlot dp = gl.DataPlots(); // アクティブデータプロットを取得
DataRange dr;
int i1 = 0; // 最初のデータポイントから
int i2 = -1; // 最後のデータポイントまで
dp.GetDataRange(dr, i1, i2);
データ範囲オブジェクトでデータプロットからXYデータをvectorに取得します。
vector vx, vy;
DWORD dwRules = DRR_GET_DEPENDENT;
dr.GetData(dwRules, 0, NULL, NULL, &vy, &vx);
データ範囲を制御するData Selector
OriginCは、データ範囲を選択するためにGetNダイアログをサポートしています。
#include <GetNBox.h>
// ダイアログを開き、1つのグラフデータプロットから範囲を選択
// この選択でデータ範囲オブジェクトを構築
GETN_TREE(tr)
GETN_INTERACTIVE(Range1, "Select Range", "")
if( GetNBox(tr) ) // OKボタンで true を返す
{
DataRange dr;
dr.Add("Range1", tr.Range1.strVal);
vector vData;
int index = 0; // 範囲インデックス
dr.GetData(&vData, index); // TvData内のデータは選択したデータポイント
}
|