線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:14290
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

關於eigenvalue 和 eigenvector 的問題

尚未結案
kcg
一般會員


發表:3
回覆:1
積分:0
註冊:2003-09-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-20 18:28:05 IP:218.164.xxx.xxx 未訂閱
我在這個討論串 http://delphi.ktop.com.tw/topic.php?topic_id=57555 中的 http://www.vector-space.com/free.htm 下載c0.lib 要來計算矩陣的eigenvalue和eigenvector 可是解開後的*.obj & *.lib 一直link錯誤 我只加了這兩行 #include "..\include\c0_init.h" #pragma link "..\\lib\\c0.lib" 錯誤顯示: [Linker Fatal Error]Fatal:Unable to open file'subvector.obj' 請問一下該怎麼正確使用這個lib呢? 感謝~
kcg
一般會員


發表:3
回覆:1
積分:0
註冊:2003-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-22 14:57:52 IP:218.164.xxx.xxx 未訂閱
我執行他附的範例檔 這是Link Error的情況... 請問該如何解決呢? 感謝~
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-12 16:23:51 IP:140.124.xxx.xxx 未訂閱
你好: 我最近剛好也遇到這個問題 不知道您解決了沒有 還是有其他前輩有類似的經驗 謝謝
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-13 00:58:33 IP:219.84.xxx.xxx 未訂閱
cowbjt你好:     可以使用TNT這個library:http://math.nist.gov/tnt/     我有用過的經驗,如果有問題再提出來吧~        順便丟一個LU分解的example可以參考看看  
 
    TNT::Array2D a(3,3,0.0);
    a[0][0] = 2;
    a[0][1] = -2;
    a[0][2] = 3;
    a[1][0] = -2;
    a[1][1] = 3;
    a[1][2] = -4;
    a[2][0] = 4;
    a[2][1] = -3;
    a[2][2] = 7;        std::cout << a;
    JAMA::LU lu_a(a);
    TNT::Array2D l = lu_a.getL();
    TNT::Array2D u = lu_a.getU();
    std::cout << l;
    std::cout << u;
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-13 11:13:36 IP:140.124.xxx.xxx 未訂閱
版主您好:    感謝您的分享 這個library真的是很不錯 不過,想請問一下: 我在單純用tnt.h 裡的Array2D時候都很正常 但一用到jama_eig.h,在complie時就會有 "Ambiguity between 'std::sqrt(double)' and 'std::sqrtl(long double)'" 的error 出現說,而引起這個error 的code 是 Real g = sqrt(h);    請問一下,為什麼他會說分不清楚sqrt和sqrtl呢?    謝謝    ---------------------------------------------------    我剛剛看了一下,似乎是因為我宣告Array2D時是用int TNT::Array2D而導致在型態轉換上無法確定 不知道我這樣的推論正不正確 發表人 - cowbjt 於 2005/04/13 11:28:08
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-13 15:20:08 IP:219.84.xxx.xxx 未訂閱
你的推論沒錯:) 應該加個conversion就沒問題。 我會推薦這個library是因為他是完全的template打造,免去不少link的問題。而且還可以在matrix裡放入分數、大數、多項式~ 可惜的有些地方效率上可能會慢一點點..(比上另外純c寫的library)
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-13 22:29:17 IP:140.124.xxx.xxx 未訂閱
感謝版主兄 另外請問一下 利用jama得到的eigenvalue一維陣列和eigenvector二維陣列 是否彼此互相對應 (i.e. 第n個位置的eigenvalue是否對應第n行的eigenvector) 謝謝
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-24 20:30:28 IP:140.124.xxx.xxx 未訂閱
eigenvalue 與 eigenvector對應的問題 我用matlab 試驗過了,感覺上應該是的 而不知版主兄有沒有試過大型矩陣的宣告 如: TNT::Array2D< double > scatter_matrix(HEIGHT*WIDTH,HEIGHT*WIDTH); 這裡的HEIGHT*WIDTH = 10304 一般小一點的矩陣3x3、4x4,我試過都很正常,連求解都很正常 但現在是要做圖片的處理所以維度很大 連宣告都過不去了,其中,如果把型態改成int 就ok了 但,後面的算eigenvector的function一定要用到浮點的 所以這裡沒辦法用int 不知道,有沒有人跟我遇過同樣的問題
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-25 02:03:55 IP:219.84.xxx.xxx 未訂閱
cowbjt你好: 不好意思之前一直沒特別找時間來試,不過就你現在遇到的問題,用float來宣有有沒有錯誤?錯誤的訊息是什麼?
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-25 12:26:51 IP:140.124.xxx.xxx 未訂閱
版主兄你好: 用float 來宣告的確就ok了 float 和double 不是只差在精準度嗎 怪了,為什麼會float 可以double 不行呢?    另外,還有二個問題,抱歉問題有點多 1. 我用float 宣告之後是可以 TNT::Array2D< float> scatter_matrix(HEIGHT*WIDTH,HEIGHT*WIDTH); 但是,之後要算這個matrix 的特徵向量 JAMA::Eigenvalue eig(scatter_matrix); 在compire 時沒有錯,但不知是矩陣太大還是怎樣 在執行時,上面那行宣告Eigenvalue類別的指令會做很久 超過5分鐘 (我是沒試過放著讓他跑完,等一下利用上課時間放著讓他試試) 2. 這個問題比較沒那麼嚴重 我想請問的是在標準c 中似乎沒有計算矩陣(如矩陣相乘)的函試,而版主兄分享的這個tool似乎也沒有。 所以我是自已用for完成的,但以上面那個矩陣來說 好像太大了,做個處理要等30秒左右,實在很佩服matlab的開發人員。 抱歉,問題有點多,謝謝前輩耐心的指教。 發表人 - cowbjt 於 2005/04/25 12:31:44
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-04-25 12:49:39 IP:219.84.xxx.xxx 未訂閱
float的size和double不同。 你提到用int可以,那float很有可能可行。    另外時間久是一定的,matrix在求eigenvalue大部份都是用jocobi transform來做的(我不確定TNT是不是..)。complexity一定都在NxN以上,而且你又用了scatter matrix,效率上要再減一個等級…跑一個晚上能有結果或許就可以偷笑了:)    TNT有的,要仔細找找他的document。我隨手丟個自已寫的部份程式碼讓你參考:    分數組成的矩陣:  
 
        JAMA::LU > lu_a(a);
        std::cout << "L=" << endl;
        std::cout << lu_a.getL();
        std::cout << "U=" << endl;
        std::cout << lu_a.getU();
        std::cout << "LU=" << endl;
        std::cout << matmult(lu_a.getL(),lu_a.getU());
        std::cout << "Pivot=" << endl;    
        std::cout << lu_a.getPivot();
wearefamily
一般會員


發表:12
回覆:16
積分:5
註冊:2004-03-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-04-27 16:06:09 IP:140.116.xxx.xxx 未訂閱
cowbjt 兄, TNT,看了還不太清怎麼用, 可以分享你如何用TNT & JAMA 算 eigenvalue 和 eigenvector 的程式嗎?    我也在try另一套LAPACK  AMD(ACML ) 和INTEL(INTEL.MATH.KERNEL)都有做最佳化, 但還在研讀如何使用,看不懂說明書在寫什麼
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-05-15 20:22:04 IP:140.124.xxx.xxx 未訂閱
wearefamily 兄你好: 不知道你的問題解決了沒    至於怎麼用tnt 算eigenvalue 和 eigenvector  其實他的documentation 中都有寫了,沒想像中那麼難    你可以先宣告一個類別如: JAMA::Eigenvalue eig(matrix); matrix 就是要算的那個矩陣 然後利用getV()和getD(),的method 就可以得到eigenvalue 和 eigenvector 了 如: eig.getV(eig_vector_matrix); eig.getD(eig_value_matrix); 參數的部份就是用來裝eigenvalue 和 eigenvector 的矩陣了 希望對你有幫助
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-05-19 22:41:27 IP:140.124.xxx.xxx 未訂閱
不知道還有沒有人用過tnt還是其他的套件 心得怎樣 我目前大概都會求解400*400左右的矩陣 用jama 的話,大約要跑三分鐘... 而matlab大概只用三秒鐘 真是太佩服matlab 的開發人員了...
koshyang
一般會員


發表:2
回覆:7
積分:1
註冊:2004-07-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-05-23 16:06:52 IP:140.116.xxx.xxx 未訂閱
請問各位大大 這個函式庫有人用MATLAB驗算過嗎? 我驗算過似乎不對 在實對稱矩陣中 EIGENVALUES是對的 EIGENVECTORS值也是對的 但是在有些EIGENVECTORS的符號相反 不知道其它大大用這個函式庫是否有發現這個問題呢?
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-05-24 09:30:48 IP:140.124.xxx.xxx 未訂閱
koshyang兄 您好: 對eigenvector來說,[1 -2 3]和[-1 2 -3]是一樣的 這二個之中,只要不出現有些原素一樣有些不一樣([1 -2 3]和[-1 2 3])就行了 詳情可以參考一下線性代數
koshyang
一般會員


發表:2
回覆:7
積分:1
註冊:2004-07-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-05-24 12:52:19 IP:140.116.xxx.xxx 未訂閱
呵呵呵 是這樣啊 考完試就把工數還給老師了 看來我要好好K一下了    cowbjt兄 你提到400*400的矩陣要跑三分鐘 我用這個函式庫 例如將  
 Array2D  V 改成      V = new float*[n];
  for( int x = 0 ; x < n ; x   )
      V[x] = new float[n];
  for( int i = 0 ; i < n ; i   )
    for( int j = 0 ; j < n ; j   )
      V[i][j] = 0;
如此一來原本三分鐘才能解出的矩陣 四秒鐘就可以解出來了 提供給你做參考 發表人 - koshyang 於 2005/05/24 13:35:25 發表人 - koshyang 於 2005/05/24 13:57:02
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-05-25 13:10:30 IP:140.124.xxx.xxx 未訂閱
koshyang兄 您好: 小弟不太了解為什麼以那樣的型式在速度上可以加快那麼多說 可以稍為解釋一下嗎 謝謝 另外,在jama的api 中提到要用jama來計算eigenvector 其輸入的矩陣要為TNT::Array2D< Real > 的型態說 如果改為 float*[n] 似乎compile 就過不了了耶
koshyang
一般會員


發表:2
回覆:7
積分:1
註冊:2004-07-21

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-05-25 16:21:09 IP:140.116.xxx.xxx 未訂閱
你好: 這個問題可否請你另開問題討論嗎 這些經驗我想對有使用這個函式庫的朋友來說 我想有很大的幫助~
koshyang
一般會員


發表:2
回覆:7
積分:1
註冊:2004-07-21

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-05-25 16:33:59 IP:140.116.xxx.xxx 未訂閱
另外一提 如果有朋友要用這個函式庫時 解實對稱矩陣出來的值是對的 (個人解過400*400矩陣,並以 MATLAB 驗算過 運算時間不超過5秒~) 只是差在正負號不同而已 非實對稱矩陣似乎EIGENVALUES是對的 EIGENVECTORS有錯 但是用在人臉識別上已經夠用了 發表人 - koshyang 於 2005/05/25 16:43:38
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-05-25 19:13:46 IP:210.68.xxx.xxx 未訂閱
koshyang您好: 您可以將您使用的心得分享在 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=79 會員作品發表區(限本人創作發表) ,供有需要的人參考
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#22 引用回覆 回覆 發表時間:2005-05-25 21:24:07 IP:140.124.xxx.xxx 未訂閱
汗顏.... 剛才確實的去算了一下時間 在求解400*400的"對稱矩陣"的確是五秒左右 其他的三分鐘左右是在從更大的矩陣相乘而得到這400*400 真是誤會jama 了
koshyang
一般會員


發表:2
回覆:7
積分:1
註冊:2004-07-21

發送簡訊給我
#23 引用回覆 回覆 發表時間:2005-05-25 22:37:03 IP:140.116.xxx.xxx 未訂閱
JAMA確實是好用 但是它還要include TNT 真是有夠麻煩 所以我的做法是將JAMA寫成CLASS 原本要include TNT的矩陣 均寫成CLASS的成員 JAMA中有REAL的地方均設成double變數 這樣就可以直接用了
cloudman
一般會員


發表:1
回覆:3
積分:0
註冊:2005-07-17

發送簡訊給我
#24 引用回覆 回覆 發表時間:2005-07-17 21:02:01 IP:219.80.xxx.xxx 未訂閱
cowbjt 大大提到 你可以先宣告一個類別如: JAMA::Eigenvalue eig(matrix); matrix 就是要算的那個矩陣 然後利用getV()和getD(),的method 就可以得到eigenvalue 和 eigenvector 了 如: eig.getV(eig_vector_matrix); eig.getD(eig_value_matrix); 參數的部份就是用來裝eigenvalue 和 eigenvector 的矩陣了 可是我照這樣去使用 會有出現問題 請問大大有沒有寫好的範例可以提供我參考 謝謝
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#25 引用回覆 回覆 發表時間:2005-07-22 14:20:41 IP:140.124.xxx.xxx 未訂閱
cloudman您好:    以下code 您可以試試,在我這裡跑是正常的
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Memo1->Text = "";
    TNT::Array2D< double > scatter_matrix(4,4);
    TNT::Array2D< double > eig_value_matrix2(4,4);
    TNT::Array1D< double > eig_value_matrix(4);        scatter_matrix[0][0] =  3;
    scatter_matrix[0][1] =  4;
    scatter_matrix[0][2] =  2;
    scatter_matrix[0][3] =  10;        scatter_matrix[1][0] =  4;
    scatter_matrix[1][1] =  12;
    scatter_matrix[1][2] =  5;
    scatter_matrix[1][3] =  7;        scatter_matrix[2][0] =  2;
    scatter_matrix[2][1] =  5;
    scatter_matrix[2][2] =  21;
    scatter_matrix[2][3] =  5;        scatter_matrix[3][0] =  10;
    scatter_matrix[3][1] =  7;
    scatter_matrix[3][2] =  5;
    scatter_matrix[3][3] =  13;        for (int i=0; i < 4; i  )
    {
        for (int j=0; j < 4; j  )
        {
            Memo1->Text = Memo1->Text   FloatToStr(scatter_matrix[i][j]) " ";
        }
        Memo1->Lines->Add("");
    }
    Memo1->Lines->Add("");        JAMA::Eigenvalue eig(scatter_matrix);
    TNT::Array2D< double > eig_matrix(4,4);
    eig.getV(eig_matrix);        for (int i=0; i < 4; i  )
    {
        for (int j=0; j < 4; j  )
        {
            Memo1->Text = Memo1->Text   FloatToStr(eig_matrix[i][j]) " ";
        }
        Memo1->Lines->Add("");
    }
    Memo1->Lines->Add(" ----------------------------------- ");
    eig.getRealEigenvalues(eig_value_matrix);
    for (int j=0; j < 4; j  )
        Memo1->Text = Memo1->Text   FloatToStr(eig_value_matrix[j]) "  ";
    Memo1->Lines->Add("");
}
cloudman
一般會員


發表:1
回覆:3
積分:0
註冊:2005-07-17

發送簡訊給我
#26 引用回覆 回覆 發表時間:2005-07-22 19:18:23 IP:219.80.xxx.xxx 未訂閱
謝謝大大的範本 我在試著研究修改
lcch
一般會員


發表:0
回覆:1
積分:0
註冊:2005-08-01

發送簡訊給我
#27 引用回覆 回覆 發表時間:2005-08-01 22:31:46 IP:163.28.xxx.xxx 未訂閱
各位前輩好 我在線代課本有看到一些數據 可是總覺得測起來 jama 好像有點怪 這是我看課本 7.2 的一組數據,下面是課本的名字 Elementary Linear Algebra 8th edition ANTON-RORRES 課本的矩陣: 0 0 -2 1 2 1 1 0 3 課本的答案: eigenvalue = 2,2,1 三組basis: [-1 0 1] [ 0 1 0] [-2 1 1] jama求出來的eigenvector 3 3 -0.727607 -7.62509 -0.404061 0.485071 6.05522 -1.01015 0.485071 6.05522 0.404061 jama求出來的eigenvalue 3 3 1.5 0 0 0 1.66667 0 0 0 2 以上是課本裡面一組數據 我測起來覺得有些地方有錯 可否請大家幫忙測測看是不是我這邊的問題 最後還有一個問題 在"jama_eig.h"的檔案裡面 我在compile的時候有錯誤,錯誤是說找不到 max,min 這好像是 algorithm 的函式庫裡面的東西 因為找不到,所以我就自己寫function來頂替 不曉得這邊會不會有錯誤,下面是我自己寫來頂替的function int max( double a1, double a2){ if( a1 > a2 ) return a1 ; else return a2 ; } int min( double a1, double a2){ if( a1 < a2) return a1 ; else return a2 ; }
koshyang
一般會員


發表:2
回覆:7
積分:1
註冊:2004-07-21

發送簡訊給我
#28 引用回覆 回覆 發表時間:2005-08-02 17:42:48 IP:163.28.xxx.xxx 未訂閱
JAMA主要解實對稱與非對稱的特徵值問題 之前我有用 Matlab驗算過 實對稱解得的特徵值與特徵向量與MATLAB完全相同 非對稱解得的特徵值是對的 但是特徵向量與MATLAB得到的特徵向量 存在一特定倍數的關係 但也是其矩陣的特徵向量 放心用吧~    至於max,min的問題 請改成MAX、MIN 再加入#include <math.h>
baby95baby95
一般會員


發表:0
回覆:4
積分:0
註冊:2007-09-22

發送簡訊給我
#29 引用回覆 回覆 發表時間:2007-09-22 20:09:32 IP:218.174.xxx.xxx 訂閱
之前參照著各位大大所說的去執行jama 的運算
一切可以說是非常正常
但是最近出現了一個問題
我處理的資料是3維的資料(x y z) 且數量蠻大的
可是當我跑檔案時 會出去overflow 的問題
且是出現在tnt_i_refvec.h這個檔裡 感覺是因為不停的宣告動態陣列所造成記憶體不足?->小弟推斷

但是又沒有能力去做修正
有任何大大有遇過這樣的問題嗎?
請給我一些提示 感謝~~~~

ps.另外一問 如果想看有關特徵值跟C語言結合 相關的書 可以看哪一本?
再次感謝
baby95baby95
一般會員


發表:0
回覆:4
積分:0
註冊:2007-09-22

發送簡訊給我
#30 引用回覆 回覆 發表時間:2007-09-26 10:36:40 IP:140.116.xxx.xxx 訂閱
後來經過再測試  錯誤發生在 stack overflow 
原因判斷是小弟重複宣告特徵值矩陣太多次 造成記憶體不足的問題
想到的方法為 計算後的特徵值矩陣 應該進行delete的動作
但是小弟找不到jama的刪除元件也不知該如何做起 有人能幫小弟一把嗎?
感謝~~
fusung
中階會員


發表:26
回覆:169
積分:99
註冊:2003-11-25

發送簡訊給我
#31 引用回覆 回覆 發表時間:2007-09-28 00:17:26 IP:61.229.xxx.xxx 訂閱
你好:

建議附上你的程式碼或檔案,不然有心要幫你的人還得先設計問題,

模擬你可能遇到的情況,如此一來降低回覆意願,參考看看囉!

===================引 用 baby95baby95 文 章===================
後來經過再測試 錯誤發生在 stack overflow
原因判斷是小弟重複宣告特徵值矩陣太多次 造成記憶體不足的問題
想到的方法為 計算後的特徵值矩陣 應該進行delete的動作
但是小弟找不到jama的刪除元件也不知該如何做起 有人能幫小弟一把嗎?
感謝~~
------


The first step toward proving things for yourself is to understand how others have done it before!

[<<] [1] [2] [>>]
系統時間:2024-11-23 5:33:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!