如何将 Vector<Complex> 转换为 Vector<Double>?

How can I cast Vector<Complex> to Vector<Double>?

我在 C# 中使用 Math.Net 数值库,主要使用 Vector<T>Matrix<T> 对象(进行线性回归、查找特征值等)。大多数情况下,我使用的是复数,所以我使用 Vector<Complex>(或等效矩阵),但有时我也需要使用 Vector<Double>。因此,我的问题是如何将 Vector<Complex> 转换为 Vector<Double>?或者,有没有办法只 get/set 整个 Vector 的实部(或虚部)?我在 C# 中执行此操作,这是一种我相对较新的语言(主要是我使用 C/C++ 和 MATLAB)所以如果这看起来是一个简单的问题,我深表歉意。

可能的例子:

Vector<Double> someDoubleVector; // already exists
Vector<Complex> someComplexVector; // ditto
double[] doubleArray; // ditto
double[] anotherDoubleArray; // ditto
someDoubleVector = someComplexVector.GetReal();

someDoubleVector = (Vector<Double>)someComplexVector;

或(设置为真实)

someComplexVector.SetReal(someDoubleVector);

someComplexVector.SetReal(doubleArray);

或创建时

Vector<Complex> anotherComplexVector = Vector<Complex>.Build.Dense(Vector<Double> realValues, Vector<Double> imagValues);

您可以使用Map方法在类型之间进行转换。如果你经常需要这个,你可以定义以下扩展方法:

static class VectorExtensions
{
    public static Vector<double> Real(this Vector<Complex> v)
    {
        return v.Map(x => x.Real);
    }
    public static Vector<double> Imag(this Vector<Complex> v)
    {
        return v.Map(x => x.Imaginary);
    }
}

然后只需调用

var someDoubleVector = someComplexVector.Real();

同样的方法也适用于其他类似的转化。

2015-12-30 更新:此功能自 v3.10 起已集成到 Math.NET Numerics 中。