Convert decimal and negative values ​​to integers

2 Ansichten (letzte 30 Tage)
Lev Mihailov am 4 Jul. 2022
Beantwortet: Rik am 4 Jul. 2022
There are x and y coordinates that I need to convert to integer values ​​while preserving the meaning of the graph
a = 0:pi/100:2*pi;
x=cos(a);
y = sin(x);
plot(x,y) % first graph
% plot(a,y) % second graph
12 Kommentare10 ältere Kommentare anzeigen10 ältere Kommentare ausblenden
Dyuman Joshi am 4 Jul. 2022
Ok. So, What is it that you are trying to do in the first place? How did you come up with the conversions you mentioned above?
Lev Mihailov am 4 Jul. 2022
@Dyuman Joshi take min and max values, create an array, from -5.4 ; 1.2 to 4.5, fill array from 1 to n(up to 4), where 1 is the smallest value and 4 is the maximum

Melden Sie sich an, um zu kommentieren.

Antworten (2)

Matt J am 4 Jul. 2022
Something like this, perhaps?
a = 0:pi/100:2*pi;
x=cos(a);
y = sin(x);
fcn=@(z)round(rescale(z,0,intmax('uint16')));
plot(fcn(a),fcn(y))
0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

Rik am 4 Jul. 2022
Since all your values are between -1 and 1, you need a method to discretize your data to some arbitrary (but repeatable) indices. You have two general options:
1. Have a linear lookup table. This will map all numbers lineraly to the closest integer.
2. Have a non-linear lookup table. This allows you to decide what data ranges should have more precision.
Below I will implement the simplest version of option 1 I can think of. If you want to increase performance, interp1 may be required.
discretize_values([-1 0 1],3)
ans = 1×3
1 2 3
Now we can apply this to your curve. What I show here is how you can set the precision to influence how jagged your graph will look. Set a higher number for a smoother curve. The mapping back to non-integers should of course be removed if you are planning to use this for indexing.
a=linspace(0,2*pi,200);x=cos(a);y=sin(a);
plot(a,y)
hold on
precision=20;
y2=discretize_values(y,precision);
y2=2*((y2-1)/(precision-1))-1; % map back to non-integers
plot(a,y2)
hold off
function out=discretize_values(in,precision)
% map (-1,1) to 1:precision
if any(in>1) || any(in<-1)
error('data outside expected range')
end
out=1+round((precision-1)*(in+1)/2);
end
0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu MATLAB finden Sie in Help Center und File Exchange

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by