Array.CreateInstance, Array.GetValue, Array.SetValueの各メソッドは、多次元配列でも使うことが出来ます。 次の例では、Array.CreateInstanceメソッドで指定された型の行列を表す2次元配列を作成し、Array.SetValueメソッドで値を設定して単位行列を構成しています。
Arrayクラスのメソッドを使って多次元配列の作成と要素の値の設定を行う (CreateInstance, GetValue, SetValue))
using System;
class Sample {
// 任意の長さ・型の単位行列を生成する
static Array CreateIdentityMatrix(int length, Type typeOfMatrix)
{
// 指定された型でlength×length行列となる2次元配列を作成
var matrix = Array.CreateInstance(typeOfMatrix, length, length);
// 行列の対角成分に1、それ以外を0に設定する
for (var i = 0; i < length; i++) {
for (var j = 0; j < length; j++) {
if (i == j)
matrix.SetValue(1, i, j);
else
matrix.SetValue(0, i, j);
}
}
return matrix;
}
// 行列を表示する
static void PrintMatrix(Array matrix)
{
for (var i = 0; i < matrix.GetLength(1); i++) {
Console.Write("(");
for (var j = 0; j < matrix.GetLength(0); j++) {
Console.Write("{0,-5} ", matrix.GetValue(i, j));
}
Console.WriteLine(")");
}
}
static void Main()
{
// int型で2行2列の単位行列を作成
var matrix1 = (int[,])CreateIdentityMatrix(2, typeof(int));
PrintMatrix(matrix1);
Console.WriteLine();
// float型で4行4列の単位行列を作成
var matrix2 = (float[,])CreateIdentityMatrix(4, typeof(float));
// 行列内の各要素をスケーリング
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
matrix2[i, j] *= 0.25f;
}
}
PrintMatrix(matrix2);
Console.WriteLine();
}
}
実行結果
(1 0 ) (0 1 ) (0.25 0 0 0 ) (0 0.25 0 0 ) (0 0 0.25 0 ) (0 0 0 0.25 )