2015-01-20 67 views
2

我在C#中使用Math.Net數字庫,主要使用Vector<T>Matrix<T>對象(進行線性迴歸,查找特徵值等)。大多數情況下,我正在處理複雜的數字,所以我使用Vector<Complex>(或相當於矩陣),但我有時也需要使用Vector<Double>。因此,我的問題是,如何將Vector<Complex>投射到Vector<Double>?或者,有沒有辦法只獲取/設置整個Vector的真實(或虛構)部分?我在C#中這是一個我相對較新的語言(主要是使用C/C++和MATLAB),所以我很抱歉,如果這看起來像一個簡單的問題。如何將Vector <Complex>投射到Vector <Double>?

可能的實例:

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); 

回答

3

時,您可以使用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中。

+0

注意,這是很常見的,我們應該考慮直接將這種擴展方法添加到Math.NET Numerics中。 – 2015-01-21 01:07:47

+0

完美!這正是我想要的。謝謝。 – WHM 2015-01-21 17:15:28

相關問題