スポンサーサイト

--.--.-- *--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[解決済] Taucsではまる

2008.07.11 *Fri
行列ソルバーにはタカシ君が一生懸命コンパイルしてくれたUMFPACKを使っていたのだが、どうもVS2005で問題が起こるので、新しいライブラリにしようと一念発起してTAUCSを使いたいと思い、三谷さんのHPも参考にしつつ、コンパイルまでは成功したが、リンク後のlibファイルから関数が呼びだせない...
こういうエラーが一番嫌いだ。なんでバイナリ配布してくれないかなあ。

1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_linsolve が関数 _main で参照されました。
1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_zcomplex_create_fn が関数 _main で参照されました。
1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_ccomplex_create_fn が関数 _main で参照されました。
1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_ccs_read_hb が関数 _main で参照されました。
1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_ccs_read_ijv が関数 _main で参照されました。
1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_getopt_double が関数 _main で参照されました。
1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_getopt_string が関数 _main で参照されました。
1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_getopt_boolean が関数 _main で参照されました。
スポンサーサイト
COMMENT : 8
TRACKBACK : 0
CATEGRY : 未分類

COMMENT

コンパイルしたバイナリ置いたよと言っている人がgoogleのキャッシュにいたので、それを使ってみたところ、エラーは二個に減りました。これはバージョン違いか?

1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_zcomplex_create_fn が関数 _main で参照されました。
1>taucs_run.obj : error LNK2019: 未解決の外部シンボル _taucs_ccomplex_create_fn が関数 _main で参照されました。
2008/07/11(金) 14:11:31 | URL | owd #- [Edit
ああ、やっぱりタカシ君のバイナリ使って、VS2003世界に留まっていた方が幸せな気がしてきた...
2008/07/11(金) 14:18:47 | URL | owd #- [Edit
不思議だ。
うーん、やっぱUMFPACKを2005でなぜ動かないかを追求した方がいいかも。
2008/07/11(金) 14:22:19 | URL | owd #- [Edit
あっ通った!(UMFPACKが)
しつれいしました...

そしてテストプログラムもちゃんと動きました。

やっぱTaucsなんてダメだ。UMFPACKだな。タカシ君だ。タカシ君しかいない。俺のアイドルだ。

#Taucsがダメだというのは偏見です。真にうけないように。
2008/07/11(金) 14:55:32 | URL | owd #- [Edit
あ、でも僕のあのバイナリって、デバック情報を書き出そうとすると、沢山警告をはきませんか?
なんかあれがいやで、CG法を書いてみたところ、umfpackよりちょっと速くて、ちょっと精度の悪いやつが出来ましたよ。
2008/07/11(金) 19:29:19 | URL | takashi #A0ka68/. [Edit
えーまじすか!スゴイ!
なぜなら、私も大昔CG法を実装した事があるけど、UMFPACKより何倍も遅かったからです..

でも、それってもちろん実装の技術にもよるけど、行列の表現形式にもよる気がしてきた。どうやって表現してるの?私のは確か行ごとにリンクトリストにしていた気が。もしそうしているなら脱帽です。ぜひ使わせてください。
2008/07/12(土) 01:24:51 | URL | owd #- [Edit
UMF packと同じデータ構造(Ax,Ap,Aiのやつ)を使ったら、行列とベクトルの掛け算とかが効率的に書けてうまくいきました。でもなんか、途中でイテレーションが終わってしまっているのか、ちゃんとした答えが出てこないときもあるんで、あまり信用できないのですが・・・


inline void SolveLinearSystemByCG(const int N, const double* Ax, const int* Ap, const int* Ai, const double* b, double* result, double threshold = 0.0000001)
{

    size_t double_N = sizeof( double ) * N;
    double *m_cg_r = new double[ N ];   
    double *m_cg_d = new double[ N ];
    double* m_cg_q = new double[ N ];


        //r = b - Ax ( A is symmetric!! )
        memcpy( m_cg_r, b, double_N );
        for( int i = 0 ; i < N ; ++i)
        for( int j = Ap[i]; j < Ap[i+1]; ++j)
            m_cg_r[ i ] -= Ax[ j ] * result[ Ai[j] ];

        //d = r
        memcpy( m_cg_d, m_cg_r, double_N );

        //deltaNew = r_t * r
        double deltaNew = 0;
        for( int i = 0; i < N; ++i) deltaNew += m_cg_r[i] * m_cg_r[i];


        //deltaZero = deltaNew
        double deltaZero = deltaNew;

        int iteration = 0;
        while( ( iteration < N && deltaNew > threshold) )
        {
                //q = Ad
                memset( m_cg_q, 0, double_N );
                for( int i = 0 ; i < N ; ++i)
                for( int j = Ap[i]; j < Ap[i+1]; ++j)
                m_cg_q[ i ] += Ax[ j ] * m_cg_d[ Ai[j] ];


                //alpha = deltaNew / (d_t * q )
                double alpha = 0;
                for( int i = 0; i < N ; ++i ) alpha += m_cg_d[i] * m_cg_q[i];
                alpha = deltaNew / alpha;


                // x = x + alpha * d
                for(int i = 0; i < N; ++i) result[i] += alpha * m_cg_d[i];

                if( iteration % 20 == 0 ){
                        //r = b - Ax
                        memcpy( m_cg_r, b, double_N );
                        for( int i = 0 ; i < N ; ++i)
                        for( int j = Ap[i]; j < Ap[i+1]; ++j)
                                m_cg_r[ i ] -= Ax[ j ] * result[ Ai[j] ];

                }else{
                        //r = r - alpha * q
                        for( int i = 0; i < N; ++i) m_cg_r[i] -= alpha * m_cg_q[i];
                }

                //deltaOld = deltaNew
                double deltaOld = deltaNew;

                //deltaNew = r*r
                deltaNew = 0;
                for( int i = 0; i < N; ++i) deltaNew += m_cg_r[i] * m_cg_r[i];

                //beta = deltaNew / deltaOld
                double beta = deltaNew / deltaOld;

                //d = r + beta + d
                for( int i = 0; i < N; ++i) m_cg_d[i] = m_cg_r[i] + beta * m_cg_d[i];

                ++iteration;
        }

        delete[] m_cg_r ;
        delete[] m_cg_d ;
        delete[] m_cg_q ;
}
2008/07/13(日) 18:29:08 | URL | takashi #/0Q1rLGU [Edit
のわっ!ソースコードコピペ!
ベテランプログラマの最終兵器(謎)ですな。こんなに短いんですね…すばらしい。

使わせていただきます。ありがとう!!!
2008/07/15(火) 00:21:15 | URL | owd #- [Edit

Comment Form


秘密にする
 

TRACKBACK

TrackBack List

プロフィール

大和田 茂

Author:大和田 茂


元IT系の研究家。現在はゲーム/玩具作家をめざしている。


Stud Hungering for Intense Gratification and Erotic, Rapturous Undulation


Get Your Sexy Name





Twitter Updates



    follow me on Twitter




    最近の記事



    最近のコメント



    最近のトラックバック



    月別アーカイブ



    カテゴリー



    ブロとも申請フォーム

    この人とブロともになる



    ブログ内検索



    RSSフィード



    リンク

    このブログをリンクに追加する



    Copyright © 大和田茂ブログ All Rights Reserved.
    Images from ふるるか Designed by サリイ
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。