Different answers for the same algorithm

2 visualizaciones (últimos 30 días)
farah fadel
farah fadel el 20 de Mzo. de 2020
Comentada: farah fadel el 28 de Mzo. de 2020
I am getting different values of the width upon calling the findwidth function or writing its algorithm (exactly the same) in the main script. Is there a reason to justify that and know what is true?
The main script looks like this:
for i=1:10
:
for j=1:13
for p=1:length(c1)
:
P1new=[P11(concavev(i):n,:);P11(1:c1(p),:)];
width(i,j,p)=findwidth(P1new)
end
end
end
%the width function :
function width=findwidth(P11)
[k,av] = convhull(P11);
CP=[P11(k,1),P11(k,2)];
for x=1:(length(CP)-1)
z=1:(length(CP)-1);
for z=1:(length(CP)-1);
D(x,z)=Seg_point_dis(CP(z,:),CP(z+1,:),CP(x,:))
end
end
D1=max(D,[],2)
width=min(D1);
end
  16 comentarios
Guillaume
Guillaume el 27 de Mzo. de 2020
I've only checked the first few lines of your code and stopped at CheckConc.
You're still using length on a 2-column matrix (both in the script and in CheckConc. I recommend that you never use length. For a vector, use numel. For a matrix, use size and explicitly specify which dimension you want to know the size of, rather than assuming that length will return the size of the dimension you are hoping for. So, use size(P1, 1) and size(v, 1)
The reason I stopped at CheckConc is that the function is wrong. It only performs N-1 checks for a N sided polygon so is missing one vertex in the concavity check. I've not tried to understand the math you're doing. There are more efficient algorithm to check that concavity. See stackoverflow and math.stackexhange. If you're guaranteed that your polygon is not self-intersecting that latter one would be best. It can be implemented without any loop in matlab.

Iniciar sesión para comentar.

Respuestas (1)

Aditya Patil
Aditya Patil el 27 de Mzo. de 2020
Inside findwidth function, you have modified the variable D, which is a global variable. This creates the issue.
Instead, pass D as a parameter to the function, as follows ( parameter named E in the code below)
function width=findwidth(P11,ncc, E)
if ncc~=0
[k1,av] = convhull(P11);
CP=[P11(k1,1),P11(k1,2)];
else
CP=P11;
end
for q=1:(length(CP)-1)%:(length(CP)-1)
for z=1:(length(CP)-1)
E(q,z)=Seg_point_dis(CP(z,:),CP(z+1,:),CP(q,:));
end
end
D1=max(E,[],2) ;
width=min(D1);
end

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by