linear least-squares for large-scale dense matrix
I use the function "cv::solve(src1, src2, dst, DECOMP_SVD)" to solve a least-squares problem (i.e., src1 * dst = src2). The size of src1 is 29030 * 7809 and the size of src2 is 29030 * 122. Both types of src1 and src2 are CV_32FC1. OpenCV crashes at the 1370 line of "lapack.cpp" and the code of this line is "buffer.allocate(bufsize)". "buffer" is a "AutoBuffer< uchar >" and "bufsize" is 1151016404. Is this problem caused by out-of-memory? My physical memory is 8G and operating system is 64bit Win7.
Mat A(29030,7809,CV_32FC1);
Mat b(29030,122,CV_32FC1);
for(i=0;i<29030;i++)
{
for(j=0;j<7809;j++)
A.at<float>(i,j)=float(i*7809+j);
for(j=0;j<122;j++)
b.at<float>(i,j)=float(i*122+j);
}
Mat x;
solve(A,b,x,DECOMP_SVD);
My c++ knowledge is not the best, you know. But I think your Matrices are getting allocated on the stack which is kind of small, but fast. You should maybe create them on the heap. So try it like this: Mat *A = new Mat(29030, 7809, CV_32FC1); Mat *B = new Mat(29030, 122, CV_32FC1);
I could of course be totally wrong, but at the moment you are trying to allocate 878 MByte on the stack :P
Thank you. I have solved this problem by convert the compiling platform to x64. On x86 platform, only 2G physical memory can be used. It's my fault, not OpenCV :)
Did you try my solution? Im curious if that actually works.
If this problem is solved, please use the answer functionality, add your own solution and accept it. This way the problem will appeared solved and people could reuse your solution on a later time.
@Moster, I did not try because I think automatic variables are created on the heap. Any way, problem is gone :)
@StevenPuttemans, "New users must wait 2 days before answering their own question." I will post an answer later. Thank you for reminding.