と呼ばれるクラスがありますMatrix : IEnumerable<double>
(古典的な数学行列。基本的には、いくつかの機能を備えた2D配列です)。
クラスは不変であるため、インスタンスの作成後にその値を変更する方法はありません。
既存の値で行列を作成したい場合は、次のように配列をコンストラクターに渡す必要があります。
double[,] arr = new double[,]
{
{1,2,3}, {4,5,6}, {7,8,9}
};
Matrix m = new Matrix(arr);
これを次のようにする方法はありますか: (?)
Matrix m = new Matrix
{
{1,2,3}, {4,5,6}, {7,8,9}
};
アップデート:
それを機能させるハックっぽい方法を見つけました。この解決策が適切かどうかはわかりませんが、うまくいきます。
class Matrix : ICloneable, IEnumerable<double>
{
// Height & Width are initialized in a constructor beforehand.
/*
* Usage:
* var mat = new Matrix(3, 4)
* {
* {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}
* };
*/
int rowIndex;
bool allowArrayInitializer;
double[,] tempData;
double[,] data;
public void Add(params double[] args)
{
if(!allowArrayInitializer)
throw new InvalidOperationException("Cannot use array initializer");
if(args.Length != Width || rowIndex >= Height)
throw new InvalidOperationException("Invalid array initializer.");
for(int i = 0; i < Width; i++)
tempData[i, rowIndex] = args[i];
if(++rowIndex == Height)
data = tempData;
}
}