3

公式のユーザー ガイドラインによると、sgelsd は最小二乗問題を解くために使用されます。

min_x || b - Ax ||_2

また、行列 A を四角形でランク落ちにすることができます。また、sgelsd ソース コードのインターフェイスの記述によると、b が入出力パラメーターとして使用されます。sgelsd が終了すると、b に解が格納されます。したがって、b は m*sizeof(float) バイトを占有します。解 x には n*sizeof(float) バイトが必要ですが (A が am*n 行列で、b が am*1 ベクトルであると仮定します)。

ただし、n>m の場合、b のメモリは小さすぎて解 x を格納できません。この状況にどう対処するか?sgelsd ソース コードのコメントからはわかりませんでした。n*sizeof(float) バイトを b に割り当て、最初の m*sizeof(float) を使用して b ベクトルを格納できますか?

ありがとう。

4

1 に答える 1

2

インテル® MKLのこの例に答えがあります。B は LDB*NRHS (LDB = max(M,N)) として割り当てられ、ゼロが埋め込まれます。入力 B は必ずしも 1-ベクトルではないことに注意してください。SGELSD は複数の最小二乗問題を同時に処理できます (したがって NRHS )。

SGELSDのLapack ドキュメントから:

[イン、アウト] B

      B is REAL array, dimension (LDB,NRHS)
      On entry, the M-by-NRHS right hand side matrix B.
      On exit, B is overwritten by the N-by-NRHS solution
      matrix X.  If m >= n and RANK = n, the residual
      sum-of-squares for the solution in the i-th column is given
      by the sum of squares of elements n+1:m in that column.

[in] LDB

      LDB is INTEGER
      The leading dimension of the array B. LDB >= max(1,max(M,N)).
于 2013-01-20T22:06:00.660 に答える