Changing numbers in dataset

3 views (last 30 days)
Rajesh
Rajesh on 7 Jun 2022
Commented: Voss on 8 Jun 2022
Hi,
I have a dataset of size m*n. The dataset only contains integer numbers between 1 to 5. Now I want to change the numbers as
1=-1
2=-1+(2/4)=-1/2
3=-1+(4/4)=0
4=-1+(64)=1/2
5=-1+(8/4)=1
Is there any efficient way of doing that?

Accepted Answer

Voss
Voss on 7 Jun 2022
Edited: Voss on 7 Jun 2022
Considering that -1 can be written as -1+(0/4), a pattern becomes clear:
1 -> -1+(0/4)
2 -> -1+(2/4)
3 -> -1+(4/4)
4 -> -1+(6/4)
5 -> -1+(8/4)
In general, say:
x -> -1+(y/4)
The pattern is that each time x is incremented by 1 on the left-hand side: x = (1, 2, 3, 4, 5), that corresponds to y being incremented by 2 on the right-hand side: y = (0, 2, 4, 6, 8). And y is 0 when x is 1.
Thus we can say that y = 2*(x-1), so that the rule is:
x -> -1+(2*(x-1)/4)
or, simplifying:
x -> -1+(x-1)/2
So if x is your m-by-n matrix, then the transformed version of x is -1+(x-1)/2.
m = 3;
n = 4;
x = randi(5,[m,n])
x = 3×4
4 2 5 2 3 2 1 2 1 5 5 2
new_x = -1+(x-1)/2
new_x = 3×4
0.5000 -0.5000 1.0000 -0.5000 0 -0.5000 -1.0000 -0.5000 -1.0000 1.0000 1.0000 -0.5000
  2 Comments
Voss
Voss on 8 Jun 2022
You're welcome!

Sign in to comment.

More Answers (1)

Chris
Chris on 7 Jun 2022
For only five values, I think it's pretty efficient to do a direct replacement:
ds_new = zeros(size(dataset))
ds_new(dataset == 1) = -1;
ds_new(dataset == 2) = -0.5;
% ...etc
If you need more flexibility, this is what I came up with:
ds = randi(5,4)
ds = 4×4
4 4 1 2 4 2 5 4 3 1 2 5 1 3 2 3
ints = 1:5;
vals = 0.5*(ints-1)-1;
dsnew = zeros(size(ds));
for idx = 1:numel(ints)
dsnew(ds == idx) = vals(idx);
end
dsnew
dsnew = 4×4
0.5000 0.5000 -1.0000 -0.5000 0.5000 -0.5000 1.0000 0.5000 0 -1.0000 -0.5000 1.0000 -1.0000 0 -0.5000 0

Categories

Find more on Creating and Concatenating Matrices 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!

Translated by