Plot unit circle in chebychev metric in MATLAB

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
1 reply · 3K views
meldraft
Messages
280
Reaction score
2
Ok, so I'm trying to plot the unit circle using the chebyvhev metric, which should give me a square. I am trying this in MATLAB, using the 'pdist' and 'cmdscale' functions. My uber-complex code is the following:

clc;clf;clear all;
boundaryPlot=1.5;

% Euclidean unit circle
for i=1:360
theta(i)=deg2rad(i);
end
zc=[cos(theta)' sin(theta)'];

% Transform to Chebychev metric
x=zc(:,:);
D=pdist(x,'chebychev');
D1=squareform(D);
y=cmdscale(D1);


% Plots
hold on
plot(y(:,1),y(:,2));
axis square;axis([-boundaryPlot boundaryPlot -boundaryPlot boundaryPlot])
plot([-boundaryPlot boundaryPlot],[0 0],'k')
plot([0 0],[-boundaryPlot boundaryPlot],'k')

where the part in bold is the really important part of the code. I have two problems with this. First, the 'y' variable which is supposed to hold the coordinates under the new metric has a size of 360x180. One of these dimensions should have been 2, which is the dimension of the L-p space (p=2).

My second problem is that I get the plot you can see in the attachment, which corresponds to the Manhatan metric, and has rounded edges for some reason.

Has anyone done this calculation before? Is there some other syntax/function I should be using??
 

Attachments

  • untitled.jpg
    untitled.jpg
    10.7 KB · Views: 629
Physics news on Phys.org
The correct syntax should be:clc;clf;clear all;boundaryPlot=1.5;% Euclidean unit circlefor i=1:360 theta(i)=deg2rad(i);endzc=[cos(theta)' sin(theta)'];% Transform to Chebychev metricx=zc(:,:);D=pdist(x,'chebychev');D1=squareform(D);[V,L]=cmdscale(D1);y=V*sqrt(L);% Plotshold onplot(y(:,1),y(:,2));axis square;axis([-boundaryPlot boundaryPlot -boundaryPlot boundaryPlot])plot([-boundaryPlot boundaryPlot],[0 0],'k')plot([0 0],[-boundaryPlot boundaryPlot],'k')