an issue with Matrix Index exceed Matrix

1 visualización (últimos 30 días)
shawin
shawin el 24 de Sept. de 2017
Editada: shawin el 26 de Sept. de 2017
I have changed the code to:
X=data;
epsilon=1;
MinPts=37;
C=0;
[IDX]=DBSCANf(X,epsilon,MinPts);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [IDX, isnoise]=DBSCANf(X,epsilon,MinPts)
C=0;
n=size(X,1);
% cluster lables initialize
% IDX=zeros(n,1);
D=pdist2(X,X);
visited=false(n,1); % produce array of logical false for example, false(2)
logical 2x2 zero array
isnoise=false(n,1); % array of logical false
for i=1:n
if ~visited(i)
visited(i)=true;
Neighbors=RegionQuery(i,D,epsilon);
if numel(Neighbors) < MinPts % Number of array elements
% X(i,:) is NOISE
isnoise(i)=true;
else
C=C+1;
IDX= ExpandCluster(i,Neighbors,C,visited,D,epsilon,MinPts,n);
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function IDX = ExpandCluster(i,Neighbors,C,visited,D,epsilon,MinPts,n)
IDX=zeros(n,1);
IDX(i)=C;
k = 1;
while true
j = Neighbors(k);
if ~visited(j)
visited(j)=true;
Neighbors2=RegionQuery(j,D,epsilon);
if numel(Neighbors2)>=MinPts
Neighbors=[Neighbors Neighbors2]; %#ok
end
end
if IDX(j)==0
IDX(j)=C;
end
k = k + 1;
if k > numel(Neighbors)
break;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Neighbors=RegionQuery(i,D,epsilon)
Neighbors=find(D(i,:)<=epsilon); % distance will work one by one i=1 to 10
end
the IDX values are zeros :( ??

Respuestas (1)

dpb
dpb el 24 de Sept. de 2017
Editada: dpb el 24 de Sept. de 2017
Use the debugger to see where your implementation logic breaks down...but, the problem arises from
function IDX =ExpandCluster(i,Neighbors,C,visited,D,epsilon,MinPts)
IDX(i)=C;
k = 1;
while true
j = Neighbors(k);
...
if IDX(j)==0
...
the array IDX will be of size(1,i) and the first time the function is called i==1 but then j isn't directly related to i.
functions have local scope, array IDX inside the function has nothing whatever to to with the array in the calling function; if you intend to be operating on it you'll need to pass it.
Also note that Matlab passes only copy of arrays; any modifications made in the function are again local copies only and array arguments modified not passed back to the calling routine.
Upshot is, allocate IDX in the function if you're building it in the function.
Also your assignment in the calling function will overwrite the previous array definition and IDX will be size as returned from the ExpandCluster function. As you've written logic here the statement
IDX=zeros(n,1);
has no effect at all.
  5 comentarios
dpb
dpb el 26 de Sept. de 2017
Well, we don't either...it's logic error, not syntax and we don't have your data nor even an explanation of what you are trying to do. That's the first part of coding; writing a clear problem statement and defining the data structure so one can implement it in code.
shawin
shawin el 26 de Sept. de 2017
Editada: shawin el 26 de Sept. de 2017
dpb: the algorithm is working well if we have it in the format below : https://pastebin.com/17DgD4EU open link but when separate the method it generates zeros

Iniciar sesión para comentar.

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by