Maximum variable size allowed by the program is exceeded.
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hi all I am applying a alogorithm after computing the gradient I am getting an error.My code is
if K>1
maxgrad=sqrt(double(gradscalex.*gradscalex+gradscaley.*gradscaley));
[gradscale gidx]=max(maxgrad,[],3);
gxtemp=zeros(M,N);
gytemp=gxtemp;
for kn=1:K
[rowidx colidx ]=ind2sub(size(gidx),find(gidx==kn));
gxtemp(rowidx,colidx)=gradscalex(rowidx,colidx,kn);
gytemp(rowidx,colidx)=gradscaley(rowidx,colidx,kn);
end
gradscalex=gxtemp;
gradscaley=gytemp;
end
??? Maximum variable size allowed by the program is exceeded.
Error in ==> Untitled at 36 gxtemp(rowidx,colidx)=gradscalex(rowidx,colidx,kn); Help me plz to solve this problem.I searched out but no solution.I am using Matlab version 7.11.0(R2010b) with 32-Bit operating system and 4GB RAM.
6 commentaires
per isakson
le 4 Jan 2013
Modifié(e) : per isakson
le 4 Jan 2013
I think it would improve your chances to get an answer if you supplied reasonable values for gradscalex, gradscaley, and K. From the code I assume K is a scalar.
Roger Stafford
le 5 Jan 2013
You have said rowidx and colidx are column vectors with 154723 elements each which I would guess means that approximately two-thirds of your maximum values occurred in the first third-dimensional layer, that is when kn = 1.
Are you aware that when you write
gradscalex(rowidx,colidx,kn)
with kn = 1 this would produce an array of size 154723 by 154723? I am sure this is not what you intended and I am equally certain your machine is not going to let you have an array of that monstrous size.
You will have to revise your code to do what you really want at this point. If gradscalex and gradscaley are both M by N size, you probably should be using the output of find(gidx==kn) directly without using ind2sub in transferring the selected elements of gradscalex and gradscaley into gxtemp and gytemp, as seems to be your intention.
Réponse acceptée
Matt J
le 5 Jan 2013
Modifié(e) : Matt J
le 5 Jan 2013
I have the vague impression that you're trying to do this:
[M,N,P]=size(gradscalex);
[mm,nn]=ndgrid(1:M,1:N); %pre-compute once!!
maxgrad=sqrt(double(gradscalex.*gradscalex+gradscaley.*gradscaley));
[~, gidx]=max(maxgrad,[],3);
idx=sub2ind([M,N,P],mm(:),nn(:),gidx(:));
gxtemp=reshape( gradscalex(idx) ,[M,N]);
gytemp=reshape( gradscaley(idx) ,[M,N]);
1 commentaire
Matt J
le 6 Jan 2013
Modifié(e) : Matt J
le 6 Jan 2013
Are we still talking about your originally posted code? If not, you should post a new question. However, the only likely place to get answers about a File Exchange file is from its author. That shouldn't be too hard. I notice he is rather actively responding to comments posted about the file. You could also try other HOG implementations on the File Exchange, e.g.,
If the code you posted, however, is one step in your own HOG code, it looks like that step is an edge detection step. You are trying to find some surface of maximum gradient in 3D and collect the gradient values along that 3D surface, storing them to gxtemp and gytemp. If I'm correct, the code I showed you should work fine. If not, you should explain better what the output, gxtemp and gytemp, are supposed to represent.
Plus de réponses (1)
the cyclist
le 4 Jan 2013
Probably the simplest way to debug this is to set a breakpoint with
>> dbstop if error
before you run the code. Then, run your code. It will halt execution when it hits the error, and bring you to the editor automatically.
My guess is that you will find that one (or both) of the variables "rowidx" or "colidx" are much, much larger than you expect, and the offending line is therefore attempting to create a huge array.
After you are done debugging, you might want to clear the breakpoint with
>> dbclear if error
6 commentaires
Roger Stafford
le 5 Jan 2013
To Algorithms Analyst: Have you read my comment above made 13 hours ago? The line where the error occurs is trying to generate a 154723 by 154723 array! That is undoubtedly the cause of the error message and it is also surely not what you wanted to do.
Roger Stafford
le 5 Jan 2013
To Algorithms Analyst: I recommend you try the following as an experiment. B begins here as a 3 x 3 array of zeros and we attempt to copy all the elements of the 3 x 3 array A into B except its center element.
A = [10 20 30;40 50 60;70 80 90];
B = zeros(size(A));
rc = [1 1;2 1;3 1;3 2;3 3;2 3;1 3;1 2]; % All index pairs except center
r = rc(:,1); % The row indices
c = rc(:,2); % The corresponding column indices
B(r,c) = A(r,c); % <-- The wrong way to copy them
B
As you see, it erroneously copied all nine elements. Looking at the intermediate result will begin to show why:
T = A(r,c);
T
T is not a 3 x 3 matrix but is 8 x 8 which means that not only did the center element of A get copied but each element was repeatedly copied many times for a total of 64 copyings. If instead you do this:
ix = sub2ind(size(A),r,c);
B(ix) = A(ix)
then it works correctly and there are no repetitions, just eight copyings.
This means that you should have been using a linear index in the line in question, which in fact you had already computed with the 'find' operation. This also means that the intermediate result of gradscalex(rowidx,colidx,kn) would have had a monstrous 23,939,206,729 elements in it, a bit much for any one variable to possess, I think you'll agree. I don't blame matlab for complaining - the poor thing was suffering from memory loss.
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!