First time here? Check out the FAQ!

Ask Your Question
2

linear least-squares for large-scale dense matrix

asked Aug 8 '13

grtwa gravatar image

updated Aug 9 '13

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);
Preview: (hide)

Comments

1

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

Moster gravatar imageMoster (Aug 9 '13)edit
2

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 :)

grtwa gravatar imagegrtwa (Aug 9 '13)edit
1

Did you try my solution? Im curious if that actually works.

Moster gravatar imageMoster (Aug 9 '13)edit
1

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.

StevenPuttemans gravatar imageStevenPuttemans (Aug 9 '13)edit
1

@Moster, I did not try because I think automatic variables are created on the heap. Any way, problem is gone :)

grtwa gravatar imagegrtwa (Aug 9 '13)edit
1

@StevenPuttemans, "New users must wait 2 days before answering their own question." I will post an answer later. Thank you for reminding.

grtwa gravatar imagegrtwa (Aug 9 '13)edit

2 answers

Sort by » oldest newest most voted
2

answered Aug 12 '13

grtwa gravatar image

I have solved this problem by convert the compiling platform to x64. On x86 platform, only 2G physical memory can be used.

Preview: (hide)
3

answered Aug 13 '13

Michael Burdinov gravatar image

SVD method has very high numerical robustness, but this robustness has its price both in space and in time. If you don't expect a degenerate case you can you much lighter methods that should be able to run on x86. For example:

solve(A.t()*A, A.t()*b, x, DECOMP_CHOLESKY);
Preview: (hide)

Comments

Thanks, I need deal with some degenerate case. Before using SVD, I intended to use QR. But DECOMP_QR seems to equate with DECOMP_SVD in OpenCV2.4.5.

grtwa gravatar imagegrtwa (Aug 13 '13)edit

Question Tools

1 follower

Stats

Asked: Aug 8 '13

Seen: 5,366 times

Last updated: Aug 13 '13