index out of bounds
4 views (last 30 days)
Show older comments
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
0 Comments
Answers (2)
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.
0 Comments
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
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.
See Also
Categories
Find more on C++ Data and Function Interfaces in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!