Как выделить память для 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)).