index out of bounds

6 views (last 30 days)
hamid shakeri
hamid shakeri on 21 Aug 2014
Commented: Geoff Hayes on 22 Aug 2014
Hi I'm trying to execute a program but I keep getting this error:
"Attempted to access indx(1); index out of bounds because numel(indx)=0"
I understand what it means, but I'm not able to fixe it, I need some help.
Here is the code with the error:
[nel,dum]=size(Edof);
ned=dum-1;
[n,nsd]=size(Coord);
[n,nd]=size(Dof);
nend=ned/nen;
%
for i = 1:nel
nodnum=zeros(1,nen);
for j = 1:nen
check=Dof(:,1:nend)-ones(n,1)*Edof(i,(j-1)*nend+2:j*nend+1);
[indx,dum]=find(check==0);
nodnum(j)=indx(1);
end
%
Ex(i,:)=Coord(nodnum,1)';
if nsd>1
Ey(i,:)=Coord(nodnum,2)';
end
if nsd>2
Ez(i,:)=Coord(nodnum,3)';
end
end
Thank you guys

Answers (2)

Andrew Reibold
Andrew Reibold on 21 Aug 2014
Edited: Andrew Reibold on 21 Aug 2014
My assessment: It found no values where check was equal to zero, so there was no value for 'indx'.
I don't have everything I need to double check this, but make sure that
[indx,dum]=find(check==0);
really is returning a result.

Geoff Hayes
Geoff Hayes on 21 Aug 2014
Hamid - What is the data type of the numbers in Dof and Edof - integers or floats? If floats, then you will not be able to use find(check==0) and will have to use some sort of tolerance around the numbers to see which are close enough to zero i.e.
check = [1 1.2 0.00000003 3.2 -0.00000004 4 12 55]';
tol = 0.000001;
[rowIdcs,colIdcs]=find(abs(check)<tol);
And then, check to see if anything is returned before accessing rowIdcs
if ~iesmpty(rowIdcs)
nodnum(j)= rowIdcs(1);
end
(I renamed indx and dum to rowIdcs and colIdcs because that is what the two output parameters refer to - the row indices and the column indices of the elements of check that satisfy the criteria.)
In the above example, since check is a column vector (due to the transpose '), then rowIdcs will have the indices of the rows of check that satisfy the criteria
rowIdcs =
3
5
and those values are
check(rowIdcs)
ans =
1.0e-07 *
0.3000
-0.4000
But you need to be careful. If check happens to be a row vector, then you need to use colIdcs to access those elements in check. And...if check happens to be a matrix, then you will need to use both vectors, rowIdcs and colIdcs, to get the correct value from check.
  4 Comments
Geoff Hayes
Geoff Hayes on 21 Aug 2014
Hamid - I wasn't asking for your complete GA package! I had thought that the code from above was embedded within a script or a function, and not a function itself that is part of a larger program.
I do not have the Global Optimization Toolbox so cannot run this code. I also don't know what your choice of inputs are when you start up the GAmodule.
As for the images that you attached, were they taken from when the error was being generated or just on the first call to this function? I'm asking because I noticed that you had a breakpoint in the code which implies that the code stopped here because of the breakpoint and not because of the dbstop if error. Did you try it with this statement?
Looking more closely at the code, it could be possible that the inputs result in an matrix that is empty during the calculation for check, especially as the nend is computed as
nend=ned/nen;
This could be a rational number, and may cause a problem with Dof(:,1:nend) and the other instances of its use in the function.
This is what I would like you to do: execute the statement dbstop if error prior to running your code. Then run GAmodule and wait for the debugger to stop at the line that fails. Then describe here what each of the inputs are to the coordxtr function
Edof
Coord
Dof
nen
Either paste the values for each to a comment, or save these inputs to a mat file and attach it to a comment.
Geoff Hayes
Geoff Hayes on 22 Aug 2014
Hamid - the images that you posted were not for when the error was generated but for the first iteration (when i=1 and j=1) when everything worked fine. The code fails on the next iteration (when i=1 but j=2) because
K>> check
check =
-2 -2
1 1
4 4
7 7
Notice that check does not have any zeros. So the line of code
[indx,dum]=find(check==0);
will mean that
K>> indx
indx =
Empty matrix: 0-by-1
K>> dum
dum =
Empty matrix: 0-by-1
And so
nodnum(j)=indx(1);
generates the
Attempted to access indx(1); index out of bounds because numel(indx)=0
error. You will have to modify this code to handle the event where there are no zeros in the check matrix. For example,
if ~isempty(indx)
nodnum(j)=indx(1);
end
So please add these three lines of code and try again.
Note that you may still have a problem if nodum is never updated because check is always empty, and so the output Ex, Ey, and Ez may be invalid.

Sign in to comment.

Tags

No tags entered yet.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!