Different answers for the same algorithm
Show older comments
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 Comments
darova
on 20 Mar 2020
What is going on in this script? It's hard to understand
farah fadel
on 20 Mar 2020
Edited: farah fadel
on 20 Mar 2020
darova
on 20 Mar 2020
Can't help. Sorry
Aditya Patil
on 23 Mar 2020
Can you provide the entire script? Most likely, the issue is due to either use of random variables somewhere, or repeated use of variables.
farah fadel
on 23 Mar 2020
Edited: farah fadel
on 26 Mar 2020
farah fadel
on 23 Mar 2020
Edited: farah fadel
on 23 Mar 2020
Guillaume
on 23 Mar 2020
You haven't provided the code for Seg_point_dis. Possibly the problem comes from there.
In any case, there are many issues with the code of findwidth:
- No comments whatsoever. Coupled with meaningless variable names, it's impossible to know what it's meant to be doing. Even you in 6 months time won't be able to understand it.
- You're using length on a 2D matrix. length returns either the number of rows or the number of columns (whichever is greater) Most of the times it will work fine but if your convex hull is only one point your code will error. I know it's unlikely but why leave the chance when using size(CP, 2) is guaranteed to give you the number of rows all the time.
- You create a vector z=1:(length(CP)-1); and on the very next line throw it away and use z as a for loop iterator.
- You're building a matrix D in a double loop. At each step of the inner loop, you calculate the maximum of D while you're still building it.
farah fadel
on 23 Mar 2020
farah fadel
on 23 Mar 2020
Edited: farah fadel
on 23 Mar 2020
Aditya Patil
on 26 Mar 2020
Can you provide both the variants of the code so that we can compare the results and find out what the issue is. Also, it would be helpful if you comment, align and rename variables to make the code more readable.
farah fadel
on 26 Mar 2020
Aditya Patil
on 27 Mar 2020
The arguments to bin function seem incorrect. Also, can you provide the modified code with changes that you made as per above comments by me and Guillaume?
farah fadel
on 27 Mar 2020
Aditya Patil
on 27 Mar 2020
Can you attach the files here?
farah fadel
on 27 Mar 2020
Guillaume
on 27 Mar 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.
Answers (1)
Aditya Patil
on 27 Mar 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
1 Comment
farah fadel
on 28 Mar 2020
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!