行列オブジェクトデータ操作
式で値を設定Matrix Object, Set Value By Formula
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();
行列データのコピーCopy Matrix
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つの行列に対するサンプルでは、定数による乗算と、行列同士の乗算をの方法を紹介します。
定数による行列の掛け算Matrix, Multiply with Constant
MatrixLayer ml = Project.ActiveLayer(); // アクティブ行列シートを取得
MatrixObject mo = ml.MatrixObjects(0); // 第1行列オブジェクトを取得
// 行列データの内部データオブジェクトのリファレンスを取得
// 行列のデータ型をdoubleに割り当て
matrix<double>& mat = mo.GetDataObject();
// 行列内の各データに10を掛ける。ウィンドウにこの変更を反映
mat = mat * 10;
2つの行列の掛け算Matrix, Dot Multiply
// 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(); // 転置
|