2014-07-12 8 views
1

Я использовал класс MathNet Numerics для получения собственного вектора матрицы, но оказалось, что он имеет тип Vector<Complex>, и я не смог его отличить от Vector<double>, и это то, что мне нужно для моих операций.Как получить собственные значения в виде вектора, перечисленные в порядке величины с использованием MathNet Numerics?

Это, как я получил собственный вектор:

DenseMatrix processedData = someData; 
Evd<> eigen = processedData.evd(); 
Vector<Complex> eigenvector = (Vector<Complex>)eigen.EigenValues; 

Когда я попытался заброса «Vector<double>» программа не будет принимать его. Есть ли способ получить собственный вектор матрицы в Vector<double>?

ответ

1

Разве это не только EigenVectors недвижимость этого класса?

public abstract class Evd<T> : ISolver<T> 
where T : struct, IEquatable<T>, IFormattable 
{ 
    /// <summary> 
    /// Gets or sets the eigen values (λ) of matrix in ascending value. 
    /// </summary> 
    public Vector<Complex> EigenValues { get; private set; } 

    /// <summary> 
    /// Gets or sets eigenvectors. 
    /// </summary> 
    public Matrix<T> EigenVectors { get; private set; } 
} 

Docs здесь: http://numerics.mathdotnet.com/api/MathNet.Numerics.LinearAlgebra.Factorization/Evd%601.htm#EigenVectors

вещественная матрица NxN будет иметь до N (не обязательно уникальным) вещественных собственных значений и соответствующих собственных векторов, что оба должны быть возвращены в массивах; a complex NxN матрица будет иметь точно N (не обязательно уникальные) собственные значения с соответствующими собственными векторами.

+0

Собственные значения и собственные векторы связаны, но разные вещи. –

+1

Возможно, я неправильно понял вопрос, тем не менее последнее предложение гласит: «Есть ли способ получить собственный вектор в векторе?» – dbc

+0

Действительно, кажется, что я не понимаю вопрос. Игнорируйте мой комментарий выше. Кажется, существует некоторая путаница между собственными значениями и векторами в вопросе (vs. title). –

2

Если вы хотите, чтобы объявить все типы явно (вместо использования вар, выборочно) с Math.NET ЦИФРЫ v3 вам необходимо открыть следующие пространства имен:

using System.Numerics 
using MathNet.Numerics 
using MathNet.Numerics.LinearAlgebra 
using MathNet.Numerics.LinearAlgebra.Factorization 

Там обычно нет необходимости откройте пространственные пространства имен типа MathNet.Numerics.LinearAlgebra.Double, так как рекомендуется использовать общий тип Matrix<T> только при обращении к матрице или вектору. Таким образом, нет необходимости бросать между ними (как и в вашем примере) вообще.

Тогда пример выглядит следующим образом:

Matrix<double> processedData = Matrix<double>.Build.Random(5,5); 
Evd<double> eigen = processedData.Evd(); 
Vector<Complex> eigenvector = eigen.EigenValues; 
+0

Прошу прощения за путаницу! - Я набрал Vector , но я забыл отформатировать его как код. Я пытаюсь изменить тип Complex на double, чтобы я мог выполнять на нем регулярные операции. – covfefe