数値データ


このセクションでは、Origin Cで数値データを操作するサンプルを扱います。数値データは次のデータタイプの変数に保存することができます。

  1. double
  2. integer
  3. vector
  4. 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.");

精度と比較

次のサンプルコードでは、precround 関数を使って、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を加算

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 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 クラスは、ワークシート、行列、グラフウィンドウでデータを取得したり、配置する広範なメカニズムを提供します。

ワークシート内のデータ範囲

ワークシートに対しては、データ範囲は、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内のデータは選択したデータポイント
}