問題タブ [lapack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - lapack を使用した条件数の逆数の計算 (つまり、rcond(x))
C から LAPACK を使用して、MATLAB/Octave で rcond が行うことを正確に実行したいと考えています。
非常に単純なケース用の単純なテスト プログラムを作成しました。[1,1; 1,0] この入力の matlab と octave では、rcond と 1/cond(x,1) を使用すると 0.25 が得られますが、LAPACK を使用する場合、このサンプル プログラムは 0.0 を出力します。ID などのその他のケースでは、正しい値が出力されます。
MATLAB は実際にこのルーチンを使用して成功していると思われるため、何が間違っているのでしょうか? 私はOctaveが何をするのかを解読しようとしていますが、ラップされているためほとんど成功していません
cc testdgecon.c -o testdgecon -llapack でコンパイル。./testdgecon
c++ - LAPACK を使用した部分行列へのアクセス
LAPACK に特定の部分行列の要素を与える関数はありますか? もしそうなら、C ++の構文はどうですか?
それともコード化する必要がありますか?
linear-algebra - LAPACK SVD (特異値分解)
LAPACKを使用してSVDを計算する例を知っていますか?
math - 上三角行列の特異値分解 (SVD) の計算方法
BLASまたはLAPACKを使用してSVDを計算するアルゴリズムを知っていますか?
対称行列 A があるとします。
A から上三角行列 G を取得した後:
- A の SVD を計算するにはどうすればよいですか? ただし、G の値を使用しますか?
- マトリックス A のすべてをパスする必要がありますか、それとも G (中央のマトリックス) をパスするのに十分ですか?
実際には、G 行列を処理した後に取得しますが、その対称として、G のみを持つ (つまり、A の上三角行列のみを持つ) 対称 A の SVD を計算するにはどうすればよいですか?
lapack - 分解 LAPACK
LAPACK でのこれら 3 つの分解の例、またはこのライブラリを使用してそれらを解決する方法を教えてください。
c++ - LAPACK/BLAS と単純な「for」ループの比較
多数のベクトルと行列の計算を含むコードを C または C++ に移行したいと考えています。その目的は、コードを可能な限り高速化することです。
C コードのループを使用した線形代数の計算はfor
、LAPACK/BLAS を使用した計算と同じくらい高速ですか?または、これらのライブラリを使用することで独自の速度向上が見られますか?
言い換えれば、単純な C コード (for
ループなどを使用) は、LAPACK/BLAS を利用するコードと同じくらい高速に線形代数計算を実行できますか?
.net - 効率的なプロセスSQLServerと数値メソッドライブラリ
.net's
すべての(それnumerical methods
によって呼び出される)能力を利用できる数値メソッドライブラリを通信する方法はありますか?、.net
SQL Server
MATLAB
おそらく、を使用して、どのライブラリをお勧めしますR
か?- どのように
SQL Server
、そして.net
そのような1つまたは複数のライブラリと通信するのですか? - 例はありますか?
- との間
numerical libraries
のリンクを作成するには、どのような手順に従う必要がありますか.net
SQL Server
linear-algebra - 密な線形代数の応用
高密度線形代数の一般的な実際のアプリケーションは何ですか?
多くの問題は、人間とコンピューターの間の共通言語として線形代数を使用して簡単に記述し、効率的に計算できます。多くの場合、これらのシステムは、密な行列ではなく、疎な行列の解を必要とします。このルールに反する一般的なアプリケーションは何ですか?
コミュニティがLAPACKのようなDLAパッケージを改善するためにさらに時間を費やすべきかどうか興味があります。計算が制約されたアプリケーションでLAPACKを使用するのは誰ですか?LAPACKを使用して、並列処理を必要とする大きな問題を解決するのは誰ですか?
具体的には、密な線形代数の能力が不十分なために今日解決できない問題は何ですか。
c# - 巨大な行列を送受信できる DBMS はありますか?
LAPACKライブラリと通信しようとして.net
いるので、DBMS の外部で処理を行うことができます。
send/receive
マトリックスをバイナリとして、またはそれらを処理するためのダイレクト メモリ ポインターとして完成させることは可能ですか? 主な目的は速度であり、フラット ファイルを通過しないようにします。
Oracle, SQL Server, MySQL
この技術をサポートすることは可能ですか?.- ライブラリについてはどうですか、バイナリなどを、または
LAPACK
にエクスポートできますか? (生メモリ ポインタまたはバイナリを介してすべて).net
c#
c - プロセッサ サブセット上の互いに素なグリッドと Scalapack でのそれらの通信
要約すると、私の質問は、Scalapack (BLACS) の 2 つの異なるプロセス グリッド上の 2 つのブロック周期的に分散されたマトリックス間でマトリックス コピーを実装する方法についてです。これを pdgemr2d_ で実装しようとしています。これは、同じプロセス グリッド上の 2 つのマトリックス間でコピーする場合に頻繁に使用します。
以下は、私が直面している問題の状態に関するかなり技術的な議論です。私はそれを基本的な問題に突き止めましたが、解決策があるようには見えません...ただし、Scalapack は私がしようとしているタイプの操作が可能であると具体的に述べているため、あるに違いありません。これの適切な例はどこにもありません。
C の MPI で実行される Scalapack の 1x1 計算グリッドの初期化は、通常、次のようになります。
このコードは、MPI が認識しているプロセッサの数に関係なく、1x1 グリッドを生成します (グリッドのサイズ {1, 1} が Cblacs_gridinit に渡されます)。ここで、CONTEXT は Scalapack 関数に対して、作業中のグリッドを示します (同時に複数を使用することができ、Cblacs_get によって生成されます)。Cblacs_gridinfo は、NPROW と NPCOL をプロセッサーの行と列の数 (この場合は {1, 1}) として設定します。MYPROW と MYPCOL は、どのグリッド ブロックが属するかを各プロセッサに示します。この場合、1x1 グリッドでは、1 つのプロセッサのみが参加し、そのグリッド ID は {0, 0} です。
単純なブロック巡回分散 100x100 行列の行列記述子の初期化も、通常は単純です。
(一部のプロセッサでは num_cols_local または num_rows_local が負の整数として正確に返されるため、「保護」変数が必要な理由については後で説明します。)
上記のほとんどは、descinit_ に渡される &zeros を除いて一目瞭然です。これは、行列の最初の行が分散されるプロセッサの行と、最初の列が分散されるプロセッサの列を示します。これらの値は、descinit_ 関数で使用される場合、非常に明示的な境界を持ちます。Fortran関数自体から、
{0,0} は単一のグリッド ブロックの適切なインデックスであるため、ここでは IRSRC と ICSRC をゼロとして渡します。グリッドがはるかに大きい場合でも、最初のプロセッサ ブロックが最初の行と列の値を格納する可能性が高いため、{0,0} を渡す可能性があります。
1 つのプロセッサで実行すると、これは非常にうまく機能します。NPROW、NPCOL、MYPROW、および MYPCOL の唯一のプロセッサである RANK 0 の値は、それぞれ 1、1、0、および 0 です。この場合の CONTEXT は 0 であり、非負であることは、それが参照するグリッドがこの RANK でアクティブであることを示します。これらの値は、1x1 プロセス グリッドの存在を示し、最初のプロセッサが正しいことを示し、RANK 0 に属する正しいプロセス グリッド ブロックを示します。この場合、それが唯一のブロックです。
ただし、2 つのプロセッサで実行すると、問題が発生するため、正式にはそうすべきではありません。1 番目と 2 番目の RANK には、CONTEXT、NPROW、NPCOL、MYPROW、および MYCOL があります。
すべての値は負です。最も重要なのは、RANK 1 の CONTEXT が負であることです。これは、この RANK が 1x1 プロセッサ グリッドに参加していないことを示しています。今すぐ descinit_ を呼び出すと、すべてのプロセッサですぐに問題になります。descinit_ から Fortran コードを参照すると、次のようになります (明確にするために上記を繰り返します)。
これらの制限は、各プロセッサがグリッドに参加している限り意味があります。このようなグリッド ブロックは存在しないため、インデックスを負にしたり、プロセス グリッド内の行または列の総数以上にすることはできません。
RANK 1 では、IRSRC はゼロとして渡されますが、NPROW と NPCOL はグリッドの初期化から -1 として返されるため、descinit_ は常に失敗します。
上記のすべては、マトリックス記述子の初期化とその後のすべての操作を現在のグリッドに参加しているプロセッサに制限するだけで、エレガントではありませんが簡単に克服できます。何かのようなもの:
ただし、プロセッサ グリッドは 1 つだけではなく 2 つあり、pdgemr2d_ 関数を使用して通信する必要があります。この関数の目的は、あるグリッドの分散行列 A のサブセットを別のグリッドの分散行列 B にコピーすることです。グリッドは互いに関連している必要はなく、部分的または完全にばらばらでもかまいません。これは簡単な操作です。たとえば、コンテキスト CONTEXT_A を持つプロセッサ グリッドからコンテキスト CONTEXT_B を持つプロセッサ グリッドに行列全体をコピーしたいとします。各コンテキストのマトリックスの記述子は、desc_A および desc_B として与えられます。
これもかなり自明です。いずれかのコンテキストがグリッド メンバーを持つすべてのプロセッサで実行する必要があります。私の場合、CONTEXT_A には MPI が認識しているすべてのプロセッサにまたがるグリッドがあり、CONTEXT_B は 1x1 のシングル プロセッサ グリッドです。
pdgemr2d_ には、少なくとも CONTEXT_A と CONTEXT_B の両方に含まれるすべてのプロセッサを含むコンテキスト識別子を指定する必要があります。また、CONTEXT_A または CONTEXT_B に属さないプロセッサについては、要素 desc_A[CTXT] または desc_B[CTXT] をそれぞれ - に設定する必要があります。そのプロセッサで 1。
Cblacs_gridinit によって返される CONTEXT 値は、そのコンテキストのグリッドに参加していないプロセッサでは -1 であるため、理論上、descinit_ はこれをエレガントに行います。ただし、descinit_ は、NPROW と NPCOL の負の値に関する上記の制限により、グリッドに参加していないプロセッサでは正しい行列記述子を生成しません。
適切な分離グリッド通信を行うには、いずれかのコンテキストに参加するすべてのプロセッサでこのような行列記述子を定義する必要があります。
明らかに、pdgemr2d_ は、コード内の関数の説明が具体的に述べているように、これを克服できない欠陥として記述することはできません。
PDGEMR2D は、A の部分行列を B の部分行列にコピーします。A と B は、異なる分布を持つことができます。異なるプロセッサ グリッド上に配置することも、異なるブロック サイズを使用することも、コピーする領域の開始を A の異なる場所にすることもできます。とB.
ご協力いただきありがとうございます。これはかなり専門的な質問であることは承知しています。