DataObject::SetFormula と DataObject::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つの行列ページを付加 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::GetAsVector と matrixbase::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(); // 転置