タグ付けされた質問 「c」

Cは汎用プログラミング言語です。もともとシステムソフトウェアを実装するためのものでしたが、Cとその近縁は、ほとんどの最新のオペレーティングシステムで使用される主要言語です。抽象化の薄いレイヤーと低いオーバーヘッドにより、Cは科学計算に役立つアルゴリズムとデータ構造の効率的なコーディングを可能にします。このタグは、Cプログラミング言語に関する質問に使用します。

17
Python用の高品質な非線形プログラミングソルバーはありますか?
解決すべきいくつかの挑戦的な非凸のグローバル最適化問題があります。現在、MATLABのOptimization Toolbox(特にfmincon()algorithm ='sqp'を使用)を使用していますが、これは非常に効果的です。ただし、私のコードのほとんどはPythonで作成されているため、Pythonでも最適化を行いたいと考えています。競合できるPythonバインディングを備えたNLPソルバーはありfmincon()ますか?ちがいない 非線形等式および不等式の制約を処理できる ユーザーがヤコビアンを提供する必要はありません。 グローバルな最適化を保証していなくても構いません(保証fmincon()しません)。私は、困難な問題や、それよりもわずかに遅い場合でも、ローカル最適にロバストに収束するものを探していfmincon()ます。 OpenOptで利用できるソルバーをいくつか試しましたが、MATLABのソルバーより劣っていfmincon/sqpます。 強調するために、私はすでに扱いやすい定式化と優れたソルバーを持っています。私の目標は、ワークフローをより合理化するために、単に言語を変更することです。 Geoffは、問題のいくつかの特性が関連している可能性があると指摘しています。彼らです: 10-400の決定変数 4〜100の多項式等式制約(1〜8の範囲の多項式次数) 決定変数の数の約2倍に等しい合理的な不等式制約の数 目的関数は決定変数の1つです 不等式制約のヤコビアンと同様に、等式制約のヤコビアンは密です。

6
Fortranコンパイラは実際にどれほど優れていますか?
この質問は、「C ++ vs Fortran for HPC」への回答で最近出された2つの議論の延長です。そして、それは質問よりも少し挑戦です... Fortranを支持する最もよく耳にする引数の1つは、コンパイラーが優れていることです。ほとんどのC / Fortranコンパイラは同じバックエンドを共有するため、両方の言語で意味的に同等のプログラム用に生成されたコードは同一である必要があります。ただし、コンパイラが最適化するのはC / Fortranの方が多かれ少なかれ簡単だと主張することができます。 そこで、簡単なテストを試すことにしました。daxpy.fとdaxpy.cのコピーを入手し、gfortran / gccでコンパイルしました。 daxpy.cはdaxpy.fのf2c変換(自動生成コード、見苦しい)なので、そのコードを取り、それを少しクリーンアップしました(daxpy_cに会います)。 for ( i = 0 ; i < n ; i++ ) dy[i] += da * dx[i]; 最後に、gccのベクトル構文を使用して書き直しました(daxpy_cvecと入力します)。 #define vector(elcount, type) __attribute__((vector_size((elcount)*sizeof(type)))) type vector(2,double) va = { da , da }, *vx, *vy; vx = …
74 fortran  c  blas  benchmarking 

17
標準の数値アルゴリズムにライブラリを使用しないのは一般的ですか?
GSLのような科学計算ライブラリでは、多くの数値アルゴリズム(積分、微分、補間、特殊関数など)を利用できます。しかし、これらの関数の「手巻き」実装を使用したコードをよく目にします。必ずしも一般に配布することを目的としない小さなプログラムの場合、計算科学者の間では、必要なときに数値アルゴリズム(Webサイト、数値レシピなどからコピーまたは転記すること)を自分で実装するのが一般的ですか?もしそうなら、GSLのようなものへのリンクを避ける特別な理由がありますか、それとも他のものよりも単なる「伝統」ですか? 私はコードの再利用が大好きなので、可能な場合は既存の実装を使用することをお勧めします。しかし、科学的な計算では一般的なプログラミングよりも原理の価値が低いという理由があるのではないかと思っています。 言及するのを忘れました:ライブラリの使用に明確な利点(実行速度)があるPythonのような言語とは対照的に、CとC ++について具体的に尋ねています。
54 libraries  c 

8
Cでのタンパク質構造データの解析
私のバックグラウンドはゲノミクスですが、最近、タンパク質構造に関連する問題に取り組んでいます。Cでいくつかの関連プログラムを作成し、プロセスの最初から独自のPDBファイルパーサーを作成しました。本当に堅牢なパーサーを作成することを心配していませんでした。自分で1つ作成することが、PDBフォーマットを本当に理解するように強制する最良の方法であると思いました。 このプロセスを完了したので、もう少し堅牢で成熟したものを探しています。Cで実装されているオープンソースのタンパク質構造ライブラリはありますか?私はGoogleでいくつかを見つけることができましたが、それらのどれも聞いたことがなく、それらはあまり成熟していないか安定しているようには見えません。少し関連する質問:誰もが実際にPythonを使用してこれらすべてのタイプの計算を行っていますか?または自作コード? PS。私は基本的に、PDBファイルパーサー、結合角、結合長、ねじれ角、表面アクセス可能表面積などを計算するための関数を含むライブラリを探しています。

3
大規模なデータセットを使用した計算問題のI / O戦略
私の研究グループは、分子動力学に焦点を当てています。分子動力学は、明らかに分析しなければならない単一の軌跡の一部としてギガバイトのデータを生成する可能性があります。 私たちが懸念している問題のいくつかは、データセットの相関関係に関係しています。つまり、より逐次的なアプローチを使用するのではなく、メモリ内の大量のデータを追跡して分析する必要があります。 私が知りたいのは、大規模なデータセットのI / Oをスクリプトに処理するための最も効率的な戦略です。通常、Pythonベースのスクリプトを使用するのは、ファイルI / OのコーディングがCやFortranよりもはるかに簡単になるためですが、処理する必要のある行が数千または数億ある場合、最適なアプローチが明確ではありません。Cでコードのファイル入力部分を実行することを検討する必要がありますか、または別の戦略がより便利ですか?(単に配列全体をメモリにプリロードする方が、一連の「チャンク」(メガバイトのオーダー)の順次読み取りよりも優れているでしょうか? いくつかの追加のメモ: 私たちは、「オンライン」ツールではなく、後処理用のスクリプトツールを主に探しています。そのため、Pythonを使用しています。 上記のように、MDシミュレーションを行っています。関心のあるトピックの1つは拡散計算です。そのためには、アインシュタイン拡散係数を取得する必要があります これは、計算を開始する前にすべてのデータをメモリにロードする必要があることを意味します。すべてのデータの塊(個々の時間の記録)は互いに相互作用します。D = 16リムΔ T → ∞⟨ (X(T + Δ T )- X(T))2⟩D=16リム△t→∞⟨(バツ(t+△t)−バツ(t))2⟩D = \frac{1}{6} \lim_{\Delta t \rightarrow \infty} \left< \left( {\bf x}(t + \Delta t) - {\bf x}(t) \right)^2 \right>
15 python  c  efficiency 

5
計算
関数の近くに有する特異点X = 0。以下のため:かかわらず、その特異性は、持ち上げることができる、X = 1、一つは持つべきであるF (X )= 1をので、 E 、X = Σ K = 0 のx Kf:x↦(ex−1)/xf:x↦(ex−1)/xf \colon x \mapsto (e^x-1)/xx=0x=0x = 0x=1x=1x = 1f(x)=1f(x)=1f(x) = 1 したがって (ex−1)/x=∑k=1x k − 1ex=∑k=0xkk!ex=∑k=0xkk! e^x = \sum_{k=0} \frac{x^k}{k!} ただし、形式(ex−1)/xはx=0で定義されていないだけでなく、その点の近くで数値的に不安定です。非常に小さいxのf(x)を評価するため(ex−1)/x=∑k=1xk−1k!(ex−1)/x=∑k=1xk−1k! (e^x - 1)/x = \sum_{k=1} \frac{x^{k-1}}{k!} (ex−1)/x(ex−1)/x(e^x-1)/xx=0x=0x = 0f(x)f(x)f(x)xxx数値的するには、Taylor展開、つまり前述のべき級数の切り捨てを使用できます。 Q:関数には名前がありますか?つまり、これは一般的な問題ですか?fff Q:この状況をうまく処理するC / C …
13 c++  c 

4
スペクトルノルムシュートアウト(gcc、intel、その他のコンパイラーを使用)でCはFortranよりも遅いですか?
ここでの結論: Fortranコンパイラは本当にどれほど優れていますか? gfortranとgccは単純なコードと同じくらい速いということです。そこで、もっと複雑なものを試してみたかったのです。スペクトル標準の銃撃戦の例を取り上げました。最初に2DマトリックスA(:, :)を事前に計算してから、ノルムを計算します。(この解決策は銃撃戦では許可されていません。)FortranとCバージョンを実装しました。コードは次のとおりです。 https://github.com/certik/spectral_norm 最速のgfortranバージョンはspectrum_norm2.f90とspectrum_norm6.f90です(一方はFortranの組み込みmatmulとdot_productを使用し、他方はコードにこれら2つの関数を実装します-速度に違いはありません)。私が記述できた最速のC / C ++コードはspectrum_norm7.cppです。私のラップトップでのgitバージョン457d9d9のタイミングは次のとおりです。 $ time ./spectral_norm6 5500 1.274224153 real 0m2.675s user 0m2.520s sys 0m0.132s $ time ./spectral_norm7 5500 1.274224153 real 0m2.871s user 0m2.724s sys 0m0.124s そのため、gfortranのバージョンは少し高速です。何故ですか?より高速なC実装でプルリクエストを送信する(またはコードを貼り付ける)場合、リポジトリを更新します。 Fortranでは2D配列を渡しますが、CIでは1D配列を使用します。2D配列またはその他の適切な方法を自由に使用してください。 コンパイラについては、gccとgfortran、iccとifortなどを比較してみましょう。(ifortとgccを比較するシュートアウトページとは異なります。) 更新:バージョン179dae2を使用すると、Cバージョンのmatmul3()が改善され、同じように高速になりました。 $ time ./spectral_norm6 5500 1.274224153 real 0m2.669s user 0m2.500s sys 0m0.144s $ time ./spectral_norm7 5500 …
13 fortran  c 

1
Fortran(またはC)コードを解析して、Fortran(またはC)関数の間隔拡張を生成できるツールはありますか?
博士論文のケーススタディでは、CHEMKIN-IIの Fortranサブルーチンの間隔拡張が必要です(リンクの謝罪。SandiaNational Laboratoryによって配布されなくなったパッケージで見つけることができる最高のものです)。CHEMKIN-IIは、燃焼化学で使用される化学パッケージです。燃焼で使用される標準パッケージであるため、別のパッケージを使用することはできません(むしろ、実際には使用しないことを好みます)。 必要な間隔拡張を取得するために、社内で開発したDAEPACKというツールを使用しました。32ビットOS(gcc 2.95に対応するlibstdcのバージョン)で必要だったCHEMKIN-IIサブルーチンの必要な間隔拡張を生成できるようになっていた古いバイナリは、数年前に落ちました、そして使用するための途方もない試練になります(私が使用したソフトウェアの他のすべての部分の32ビットバージョンを見つける必要があるため)。このパッケージのソースコードもプロプライエタリですが、もともとMITで開発され、MITで働いているため、(かなりの努力を払って)DAEPACKのソースコードを取得できました。私が持っているソースコードを使用して、64ビットバージョンのLinuxおよびgcc 4.xxに対応するlibstdcのバージョンと互換性のあるDAEPACKのバージョンをコンパイルできました。しかし、このソースコードは古いと思われ、論文を完成するために必要な間隔拡張コードを正常に生成しない実行可能ファイルにコンパイルします。開発者に連絡してソースコードの修正を依頼しましたが、以前に開発者と連絡を取ったところ、彼がソースコードを修正したとしても、ソースコードを修正するには時間がかかることがわかりました。 ここに大きな問題があります。資金を使い果たしたため、卒業するまで6か月が残っています。開発者に頼ってDAEPACKをすばやく修正して、博士論文を正常に完成させることはできません。 次のことを行うパッケージが必要です。 区間拡張、テイラーモデル(区間演算を使用)、およびほぼ任意のFortran 77コードの導関数を生成します。DAEPACKによって解析されない構造は、DOループとIFステートメントだけだと思います。テイラーモデルが必要なので、コードには自動微分(AD)機能も必要です。 Fortran 77コードのソースからソースへの変換により、これらの区間拡張とテイラーモデルを生成します(つまり、コンパイラーのようにソースコードを解析して、区間拡張とテイラーモデルを計算するソースコードを生成します)。 ピンチでは、Fortran 77コードの代わりにCコードに上記の2つのことを行うソフトウェアを使用して、すべてを通過させることができf2cます。すべてを通過させることでうまくいくかどうかわからないので、私はこのようにしないことを本当に好みますf2cが、私はかなり必死です。 必死の博士課程の学生を助けることができますか? いくつかの可能な提案を予想するために、時間の制約を考えると、ここではうまくいかないアプローチがあります: DAEPACKを機能させるために一生懸命努力しています。信じて、試してみた。そして、私は頻繁に開発者を盗聴しています。 オブジェクト指向(またはオブジェクト指向のような)アプローチを使用して、区間拡張またはテイラーモデルを計算するツール。CHEMKIN-II(または他の同様に大きなライブラリ)を新しいタイプで再コーディングする時間がありません。大きすぎます。 Fortran 77/90またはC以外の言語を使用します。CHEMKIN-IIコードはFortranにあります。を使用してCに変換できf2cます。必要な場合は、TChemと呼ばれるCHEMKIN-IIのSandiaベースのクローンを使用します。私の以前の結果はCHEMKIN-IIを使用しています。私の新しい結果は私の古い結果を再現するはずであり、Canteraはケーススタディとユニットテストに基づいてCHEMKIN-IIが行うことを再現しないことをすでに知っています。さらに、私に先行した大学院生は、CHEMKIN-IIソースコードに黒魔術をかけて、区間演算を特にうまく機能させました。それを他のパッケージに複製するのは難しいでしょう。

2
ネイティブC99複合型を使用するC用のODEソルバーのオープンソースセットはありますか?
私は多くのシミュレーションの基礎としてGSLを使用してきましたが、私の目的には少し行き過ぎであり、レガシーの理由で独自の複雑なタイプを定義しています。おそらくあまり効率的ではない自分のRunge-Kutta ODEソルバーをコーディングするのではなく、ネイティブC99複合型を使用するオープンソースODEソルバーはありますか?
12 c  ode 

3
2つの12x12行列の行列式が同じかどうかのテスト
12×1212×1212 \times 12QQQJdet(Q)=det(12I−Q−J)(1)det(Q)=det(12I−Q−J)(1)\det(Q) = \det(12I-Q-J) \; \; (1)JJJ 現在、armadilloライブラリでこれを行っていますが、遅すぎることがわかりました。事は、私は何兆もの行列に対してこれを行う必要があるということであり、2つの行列式を計算することが私のプログラムのボトルネックであることがわかりました。したがって、2つの質問があります サイズを知っていれば、行列式をより速く計算するために使用できるトリックはありますか?この場合に機能する可能性のある12×1212×1212 \times12行列の乱雑な展開でしょうか? 同等性をテストする他の効率的な方法はありますか(1)(1)(1) 編集。コメントに答えるため。私はすべての接続された非自己相補的なグラフを計算する必要GGGための131313ようにGGG及びG¯¯¯¯G¯\overline{G}スパニングツリーの同じ数を有しています。この理由は、このmathoverflowの投稿にあります。マシンについては、8コア3.4GHhマシンで並行して実行しています。 編集。12×1212×1212 \times 12行列の行列式を具体的に計算するCプログラムを作成することで、予想される実行時間を50%短縮することができました。提案はまだ歓迎されています。

4
C / C ++でルンゲクッタ8次を探しています
Windowsマシンを使用して、C ++で記述された天体力学/宇宙力学アプリケーションでルンゲクッタ8次法(89)を使用したいと思います。したがって、誰もが文書化されて自由に使用できる優れたライブラリ/実装を知っているのでしょうか?予想されるコンパイルの問題がない限り、Cで記述されていても問題ありません。 これまでのところ、このライブラリ(mymathlib)を見つけました。コードは問題ないようですが、ライセンスに関する情報は見つかりませんでした。 あなたが知っている可能性があり、私の問題に適した選択肢のいくつかを明らかにすることで私を助けてくれますか? 編集: 私が思ったほど多くのC / C ++ソースコードが利用できないことがわかります。したがって、Matlab / Octaveバージョンも問題ありません(まだ自由に使用できる必要があります)。

3
軽量/インストールなしのCまたはC ++ベースの密線形代数ソルバーの推奨事項
私のプログラミングのほとんどは、私自身が使用するためのCの1回限りの研究コードです。協力者以外にコードを配布したことがありません。私は科学ジャーナルで公開しているアルゴリズムを開発しました。記事のオンラインサプリメントでソースコードとおそらく実行可能コードを提供したいと思います。同僚から、C ++(ack!)で記述する必要があり、小さな密な線形システムを解く必要があるアルゴリズムを一般化するように依頼されました。アルゴリズムのユーザーベースを取得することに成功した場合、その原因の1つは、それを使用するためのエントリバーが低い(床の上など)ためです。潜在的なユーザーは、コードを使用するためにライブラリなどをインストールしません。コードを完全に独立させ、ライセンスの影響を受けないようにしたい。Golubとvan Loanから何かを取り出して独自のソルバーを作成するだけかもしれませんが、誰かがすでに書いたバニラソルバーを使用したい場合は、そこに使用します。提案を歓迎します。ありがとう!

3
コードがコンパイラーによってベクトル化されているかどうかはどのようにしてわかりますか?
ルックアップと計算のコストに対するJed Brownの回答で例示されているように、ベクトル化された浮動小数点演算とベクトル化されていない浮動小数点演算を使用すると、コードがはるかに高速になります。最新のコンパイラの多くは、自動ベクトル化を実行できると主張しています。コードのどの部分が正常にベクトル化されているのですか?

2
コマンドライン引数をMPI_Initに渡す必要がありますか?
MPI 3.0のコードを書くとき、私は合格しなければならないargcとargvのMPI_Init通話やない、なぜ? 編集:ビル・バースの答えはいくつかの質問を提起したので、私はいくつかの発言をしたいと思います: MPI 1.1以降、argc/を渡すargv必要はありません。 質問は、具体的理由/ 1パスすべきでない程度であるargc/ argv(なぜあなたはいけません、本当にその後、答えではありません)。 それでも、argc/ argvを渡すことができない場合がありますMPI_Init(mainが制御範囲外にあり、MPIが実装の詳細である場合、静的初期化を使用してMPIを起動するライブラリを作成します)。 EDIT2:なぜ使用しないのかMPI_Init(argc, argv)という質問が頻繁に出てきました。いくつかの理由: 古い/非準拠/準拠のMPI &lt;1.1実装との互換性のためにこれを行うことはできません。MPI2またはMPI3機能を使用している場合、これらは機能しません。 MPI_Init() と同じ方法でMPIランタイムを初期化します MPI_Init(argc, argv) MPI_Init(argc, argv)MPIの実行時に渡される引数を削除argcし、argv そして MPIを初期化します。私の知る限り、それはきれいにするための唯一の方法であるargcとargvあなたがそれを使用する必要が全くMPI引数を持たないためにこれらが必要な場合はそう。 MPI_Init()より多くの状況で使用できますMPI_Init(argc, argv)。たとえば、MPIを実装の詳細として使用しているライブラリは、MPIが初期化されているかどうかをテストできます。初期化されていない場合は、呼び出すMPI_Init()と正しいことが起こります。あなたのユーザーは、あなたがMPIを使用していることを知らない、渡す必要はありませんargc、argv......あなたのライブラリーを使用するために、あなたのライブラリに、(場合には、それは引数を取っていない)自分のメインを変更する必要はありません。
8 c++  c  mpi 

1
WELL疑似乱数生成
私はMT19937テストハーネスで使用して、一様に(符号なし)32ビット[0、2322322^{32}-1]値は、元の作者のmt19937.c実装に基づいており、統計的にランダムなビットオクテットストリームの(本質的に無尽蔵)供給を生成します。これは、これらの特定のテストに必要ではないCSPRNGの代わりです。しかし、私は最近WELLPRNGを検討しています-統計的性質自体(どちらも私のニーズに十分すぎるように思われる)のためではありませんが、より効率的な実装を提案しているようです。 私は学術論文の数学的背景が足りませんが、少なくとも前者の「ねじれ」行列と焼戻し変換に従うことができました。ただし、WELL-n関数の作成者が提供するコードの多くは、いくつかの魔法の浮動小数点定数(例:)を使用して、浮動小数点生成に焦点を当てているようです2.32830643653869628906e-10。WELLコードからステップを省略して、32ビットの均一な配布を提供できますか?または、アルゴリズムは特に浮動小数点分布用に設計/バイアスされていますか? またはWELL、要件を満たしながら、「バルク」uint32ベクトル生成のパフォーマンス向上をもたらすと考えるのは間違っていますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.