このセクションでは、Origin Cで数値データを操作するサンプルを扱います。数値データは次のデータタイプの変数に保存することができます。
数値データと文字列は、ツリーのノードに保存でき、提供されたノードは上記のデータ型の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.");
次のサンプルコードでは、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"); }
// 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);
// 基本データ型、例えば 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を求める
// 基本データ型、例えば 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を加算
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 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 クラスは、ワークシート、行列、グラフウィンドウでデータを取得したり、配置する広範なメカニズムを提供します。
ワークシートに対しては、データ範囲は、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);
行列ウィンドウに対しては、データ範囲は行列オブジェクトインデックスにすることができます。
MatrixLayer ml = Project.ActiveLayer(); DataRange dr; int nMatrixObjectIndex = 0; dr.Add(ml, nMatrixObjectIndex, "X");
データ範囲からmatrixにデータを取得します。
matrix mat; dr.GetData(mat);
グラフウィンドウに対して、データ範囲はデータプロットの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);
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内のデータは選択したデータポイント }