我有自己的类使用MathDotNet包(更确切地说,是名称空间MathNet.Numerics.LinearAlgebra中的Vector<double>
类)。 Vector<double>
类有一个方法
public double At(int index)
返回指定索引的double值。在内部,Vector<double>
类对该存储使用double[]
。我认为无法直接访问内部double[]
。
class TwoVectors
{
private Vector<double> v1, v2;
// initializes the vectors v1 and v2, both have length 2.
public TwoVectors(double[] entries1, double[] entries2)
{
if (entries1 == null || entries2 == null ||
entries1.Length != 2 || entries2.Length != 2)
throw new ArgumentException("Erroneous input!");
v1 = Vector<double>.Build.Dense(entries1);
v2 = Vector<double>.Build.Dense(entries2);
}
// gives a copy of the vector data.
public double[] ArrayData
{
get
{
return new double[] { v1.At(0), v1.At(1), v2.At(0), v2.At(1) };
}
}
}
但我希望Getter不要返回矢量数据的副本,而是返回实际的矢量数据,以便将来的变化反映在矢量中。
即。如果我打电话
public static Main()
{
TwoVectors twoVec = new TwoVectors(new double[] {1, 2}, new double[] {3, 4});
twoVec.ArrayData[0] = 42;
double[] arrayData = mc.ArrayData; // this now contains {1, 2, 3, 4}
}
然后我希望arrayData包含{42,2,3,4}而不是{1,2,3,4},就像现在一样。
我相信我可以用指针做到这一点,但我不知道怎么做! 我以为我可以写
public double[] ArrayData
{
get
{
unsafe { return new double*[] { &v1.At(0), &v1.At(1), &v2.At(0), &v2.At(1) }; }
}
}
但是编译器告诉我v1.At(0)和其他地址无法获取(为什么?)。 还有指针,我想我不能写像
这样的东西twoVec.ArrayData[0] = 42;
double[] arrayData = mc.ArrayData;
但有*或&amp;的东西或 - &gt;,所以必须有其他方式...任何想法?
PS:我知道我可以为我的类写一个看起来像这样的索引器:
public double this[int i]
{
set
{
switch (i)
{
case 0: v1.At(0, value); break;
case 1: v1.At(1, value); break;
case 2: v2.At(0, value); break;
case 3: v2.At(1, value); break;
default: throw new IndexOutOfRangeException("Index must range from 0 to 3!");
}
}
}
(方法Vector<double>.At(int index, double value)
是从线程顶部获取getter方法的setter)
但是我想知道是否有直接的方法来制作像
twoVec.ArrayData[0] = 42;
按预期工作(即在矢量中进行实际更改)。