Как выделить память для b в подпрограмме LAPACK sgelsd

Согласно официальному руководству пользователя, sgelsd используется для решения задачи наименьших квадратов.

min_x || b - Ax ||_2

и позволяет матрице A быть прямоугольной и ранг-дефицитной. И в соответствии с описанием интерфейса в исходном коде sgelsd, b используется в качестве параметра ввода-вывода. Когда sgelsd закончил, b сохраняет решение. Таким образом, b занимает m*sizeof(float) байтов. В то время как для решения x требуется n*sizeof(float) байтов (предположим, что A - это матрица am * n, а b - это вектор a m*1).

Однако, когда n>m, память b слишком мала для хранения решения x. Как бороться с этой ситуацией? Я не получил его из комментариев исходного кода sgelsd. Могу ли я просто выделить n*sizeof(float) байтов для b и использовать первый m*sizeof(float) для хранения вектора b?

Благодарю.

1 ответ

Решение

Этот пример от Intel MKL имеет ответ. B выделяется как LDB*NRHS (LDB = max(M,N) и дополняется нулями. Обратите внимание, что вход B не обязательно является 1-вектором, SGELSD может обрабатывать несколько задач наименьших квадратов одновременно (следовательно, NRHS).).

Из документации Lapack для SGELSD:

[вход, выход] 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.

[в] ЛБД

      LDB is INTEGER
      The leading dimension of the array B. LDB >= max(1,max(M,N)).
Другие вопросы по тегам