2013-09-04 3 views
1

Я могу написать программу, которая использует C++ Octave API для поиска собственных векторов матрицы. Вот пример:Как получить доступ к содержимому списка собственных векторов и собственных векторов в C++ Octave API?

#include <iostream> 
#include <octave/oct.h> 
using namespace std; 

int main() { 
    int n=5; 
    Matrix L=Matrix(n,n,2); 

    EIG eig=EIG(L); 

    cout << eig.eigenvalues() << endl; 
    cout << eig.eigenvectors() << endl; 

    return 0; 
} 

который возвращает

(-5.46156e-18,0) 
(-3.1176e-32,0) 
(-4.86443e-49,0) 
(3.38528e-16,0) 
(10,0) 

(-0.18545,0) (-0.408248,0) (0.707107,0) (-0.31455,0) (0.447214,0) 
(-0.18545,0) (-0.408248,0) (-0.707107,0) (-0.31455,0) (0.447214,0) 
(-0.18545,0) (0.816497,0) (-6.72931e-17,0) (-0.31455,0) (0.447214,0) 
(-0.330948,0) (3.24211e-16,0) (-2.34737e-17,0) (0.830948,0) (0.447214,0) 
(0.887298,0) (-1.07469e-15,0) (-6.0809e-33,0) (0.112702,0) (0.447214,0) 

Отсюда, я хотел бы получить доступ к этим собственные -5.46156e-18 и т.д., а также собственный вектор значений -0.18545 и т.д., как поплавки. Как мне это сделать? Я просто не знаю синтаксиса.

+0

Я верю, что 'собственные значения()' возвращают ['ComplexColumnVector'] (http://octave.sourceforge.net/doxygen/html/d3/de3/classComplexColumnVector.html), методы которого должны быть способны получить вам элементы тебе нужно. – WhozCraig

+0

Спасибо за это! Я нашел это; Смотри ниже. –

+0

Взгляните на [документацию доксигена] Octave (http://octave.sourceforge.net/doxygen/html/d8/d28/classEIG.html). Вы увидите, что 'selfvalues ​​()' и 'selfventectors()' return, и какие методы эти классы должны получить доступ к элементам. – carandraug

ответ

1

Я признаю, что я никогда не использовал API C++ октаву, но, глядя на документация, похоже, что они перегружают(), чтобы соответствовать синтаксису Octave/MATLAB, что довольно круто. (И немного страшно, честно)

Для матрицы, строки или столбца 'x', x(i, j) предоставит элемент в i-й строке и j-ом столбце. (Обратите внимание, что это индексируется с нулевой отметкой, в отличие от того, что вы использовали MATLAB или Octave, который является одним индексом)

Для строки или столбца вы можете опустить ненужное измерение, поэтому x(n) вернет n-й элемент , для строки или столбца.

+0

Это еще лучше! –

+0

В MATLAB/Octave все 1-индексированное, я думаю, что соответствует математической нотации, которая обычно 1-индексирует матрицы. (И поскольку «i-я строка» звучит намного лучше, чем «(i + 1) -й строки»). Но если ваш ответ выводится, как вы показали, я предполагаю, что они изменили его на нуль-индексирование для C++ API , – Retsam

+1

Это правильно. Индексирование на C++ основано на нуле, используя также октавную библиотеку. – carandraug

1

Благодаря хинтов и ссылку WhozCraig, я нашел синтаксис:

#include <iostream> 
#include <octave/oct.h> 
using namespace std; 

int main() { 
    int n=5; 
    Matrix L=Matrix(n,n,2); 

    EIG eig=EIG(L); 

    cout << eig.eigenvalues() << endl; 
    cout << eig.eigenvalues().elem(0).real() << endl; 
    cout << eig.eigenvalues().elem(1).real() << endl; 
    cout << eig.eigenvalues().elem(2).real() << endl; 
    cout << eig.eigenvalues().elem(3).real() << endl; 
    cout << eig.eigenvalues().elem(4).real() << endl; 
    cout << endl; 

    cout << eig.eigenvectors() << endl; 
    cout << eig.eigenvectors().elem(0).real() << endl; 
    cout << eig.eigenvectors().elem(1).real() << endl; 
    cout << eig.eigenvectors().elem(2).real() << endl; 
    cout << eig.eigenvectors().elem(3).real() << endl; 
    cout << eig.eigenvectors().elem(4).real() << endl; 

    return 0; 
} 

, который выводит

(-5.46156e-18,0) 
(-3.1176e-32,0) 
(-4.86443e-49,0) 
(3.38528e-16,0) 
(10,0) 

-5.46156e-18 
-3.1176e-32 
-4.86443e-49 
3.38528e-16 
10 

(-0.18545,0) (-0.408248,0) (0.707107,0) (-0.31455,0) (0.447214,0) 
(-0.18545,0) (-0.408248,0) (-0.707107,0) (-0.31455,0) (0.447214,0) 
(-0.18545,0) (0.816497,0) (-6.72931e-17,0) (-0.31455,0) (0.447214,0) 
(-0.330948,0) (3.24211e-16,0) (-2.34737e-17,0) (0.830948,0) (0.447214,0) 
(0.887298,0) (-1.07469e-15,0) (-6.0809e-33,0) (0.112702,0) (0.447214,0) 

-0.18545 
-0.18545 
-0.18545 
-0.330948 
0.887298 
Смежные вопросы