行列オブジェクトデータ操作

目次

式で値を設定

DataObject::SetFormulaDataObject::ExecuteFormulaメソッドは、列/行列の値をセットするのに使用され、これは、値の設定ダイアログによる操作と同様です。以下のサンプルでは、式を使用して行列オブジェクトに値を設定する方法を示します。

// 新しい行列ウィンドウ
MatrixPage matPage;
matPage.Create("Origin");
MatrixLayer ml = matPage.Layers(); // アクティブ行列シートを取得

// 式を設定して実行
MatrixObject mo = ml.MatrixObjects(0); // 最初の matrixobjectを取得
mo.SetFormula("sin(i) + cos(j)");
mo.ExecuteFormula();

行列データのコピー

matobj_copy関数は、行列データを コピーする時に使用します。

MatrixLayer mlSrc = Project.ActiveLayer();  // アクティブ行列シートを取得
MatrixObject moSrc = mlSrc.MatrixObjects(0);  // シート内の第1行列オブジェクトを取得
MatrixLayer mlDst;
mlDst.Create("Origin");  // 新しい行列シートを取得
MatrixObject moDst = mlDst.MatrixObjects(0);  // 第1行列オブジェクトを取得
bool bRet = matobj_copy(moDst, moSrc);  // アクティブデータを新しく作成した行列にコピー

行列データの演算操作

行列上で演算操作を実行するには、行列オブジェクトからデータ行列にデータを取得し、計算して、結果を行列オブジェクトに戻します。行列の乗算操作には、constant, dot multiply, dot divide, dot power, cross, cumulative product, cumulative sum, differenceなどがあります。

次の2つの行列に対するサンプルでは、定数による乗算と、行列同士の乗算をの方法を紹介します。

定数による行列の掛け算

MatrixLayer ml = Project.ActiveLayer(); // アクティブ行列シートを取得	
MatrixObject mo = ml.MatrixObjects(0); // 第1行列オブジェクトを取得

// 行列データの内部データオブジェクトのリファレンスを取得
// 行列のデータ型をdoubleに割り当て
matrix<double>& mat = mo.GetDataObject(); 

// 行列内の各データに10を掛ける。ウィンドウにこの変更を反映
mat = mat * 10;

2つの行列の掛け算

// 2つの行列ページを付加
MatrixPage matPage1("MBook1");
MatrixPage matPage2("MBook2");
if( !matPage1 || !matPage2 )
	return;

// 名前かインデックスでページから行列シートを取得
MatrixLayer matLayer1 = matPage1.Layers("MSheet1");
MatrixLayer matLayer2 = matPage2.Layers(1); // 第2シートを取得
if( !matLayer1 || !matLayer2 )
	return;

// インデックで行列シートから行列オブジェクトを取得。名前は不可。
MatrixObject mo1 = matLayer1.MatrixObjects(0);
MatrixObject mo2 = matLayer2.MatrixObjects(0);

// 行列ウィンドウの内部データオブジェクトをのリファレンスを取得
matrix<double>& mat1 = mo1.GetDataObject();
matrix<double>& mat2 = mo2.GetDataObject();

// 新しい行列ウィンドウを用意
MatrixPage matPageNew;
matPageNew.Create("Origin");
MatrixLayer mlNew = matPageNew.Layers(0);
MatrixObject moNew = mlNew.MatrixObjects(0);
matrix<double>& matNew = moNew.GetDataObject();

// mat1から新しい行列に値をコピー
matNew = mat1;

// 各行列の値を掛け算して結果を 
// 新しい行列ウィンドウに出力
matNew.DotMultiply(mat2);

行列オブジェクトとベクターを変換する

メソッド matrixbase::GetAsVectormatrixbase::SetByVectorは、行列オブジェクトとベクターを変換するとに使用できます。

// ベクターに
MatrixLayer ml = Project.ActiveLayer();  // アクティブ行列シート
MatrixObject mo = ml.MatrixObjects(0);  // 第1行列オブジェクト
matrixbase &mb = mo.GetDataObject();  // 行列オブジェクトからデータを取得
vector vb;
mb.GetAsVector(vb);  // 行列データをベクターに変換

// ベクターから
MatrixLayer ml1;
ml1.Create("Origin");  // 行列シートを作成
MatrixObject mo1 = ml1.MatrixObjects(0);  // 行列オブジェクトを取得
matrixbase &mb1 = mo1.GetDataObject();  // データオブジェクトを取得
mb1.SetSize(2, 3);  // 2行*3列のサイズにセット
vector v = {1, 2, 3, 4, 5, 6};  // ベクターデータ
// 行列オブジェクトにベクターをセット
// 第1行:1, 2, 3
// 第2行:4, 5, 6
int iRet = mb1.SetByVector(v);

複素数値を持つ行列を操作する

Origin Cでは、matrixbaseクラス内の making a complex matrix from two real matrices, getting real, imaginary, getting phase, amplitude, calculating conjugateなどを含むメソッドのセットは複素数を扱うために使用します。

次のコードは、2つの実数の行列データで複素数行列として行列を設定するために使用されます。そして、その実数、虚数、位相、振幅を異なる行列オブジェクトに分け、元の行列オブジェクトを削除するためにConjugateを使用します。

void MatrixObject_Complex_EX() 
{
	// 実数の元データ
	matrix mR = 
        {
		{2, 2, 2, 0},
		{0, 1, 99, 99}
	};
	// 虚数の元データ
	matrix mI = 
        {
		{3, -3, 0, 3},
		{0, 99, 1, 99}
	};
	matrix<complex> mC;
	// 複素数データを作成
	int iRet = mC.MakeComplex(mR, mI);
	if(iRet == 0) 
        {
		// 複素数データ用の行列シートを作成
		MatrixLayer ml;
		ml.Create("Origin");
		MatrixObject mo = ml.MatrixObjects(0);
		ml.SetInternalData(FSI_COMPLEX);
		matrixbase &mb = mo.GetDataObject();
		mb = mC;
		
		// 実部を取得
		matrix mReal;
		mb.GetReal(mReal);
		// 虚部を取得
		matrix mImg;
		mb.GetImaginary(mImg);
		// 位相を取得
		matrix mPha;
		mb.GetPhase(mPha);
		// 振幅を取得
		matrix mAmp;
		mb.GetAmplitude(mAmp);
		// 結果のために新しい行列シートを作成
		MatrixLayer mlRes;
		mlRes.Create("Origin");
		// この行列と同じサイズの4つの行列オブジェクトを作成
		mlRes.SetSize(4, mb.GetNumRows(), mb.GetNumCols());
		MatrixObject moReal = mlRes.MatrixObjects(0);
		MatrixObject moImg = mlRes.MatrixObjects(1);
		MatrixObject moPha = mlRes.MatrixObjects(2);
		MatrixObject moAmp = mlRes.MatrixObjects(3);
		matrixbase &mbReal = moReal.GetDataObject();
		matrixbase &mbImg = moImg.GetDataObject();
		matrixbase &mbPha = moPha.GetDataObject();
		matrixbase &mbAmp = moAmp.GetDataObject();
		mbReal = mReal;  // 行列オブジェクトに実部をセット
		mbImg = mImg;  // 行列オブジェクトに虚部をセット
		mbPha = mPha;  // 行列オブジェクトに位相をセット
		mbAmp = mAmp;  // 行列オブジェクトに振幅をセット
		
		// Conjugateを使用して元の複素数行列を削除
		mb.Conjugate();
	}
}

行列オブジェクトデータを変換する

Origin Cには、行列変換のために行列内のメソッドのセットを含みます。例えば、flip a matrix horizontally, vertically, rotate a matrix, shrink a matrix, transpose a matrixなどです。

MatrixLayer ml = Project.ActiveLayer();
MatrixObject mo = ml.MatrixObjects(0);
matrixbase &mb = mo.GetDataObject();

mb.FlipHorizontal();  // 平行に移動
mb.FlipVertical();  // 垂直に移動
mb.Rotate(90);  // 90度時計回りに回転
mb.Shrink(2, 2);  // 行と列を因子2で縮小する
mb.Transpose();  // 転置