Changing numbers in dataset

3 ビュー (過去 30 日間)
Rajesh
Rajesh 2022 年 6 月 7 日
コメント済み: Voss 2022 年 6 月 8 日
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?

採用された回答

Voss
Voss 2022 年 6 月 7 日
編集済み: Voss 2022 年 6 月 7 日
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 件のコメント
Voss
Voss 2022 年 6 月 8 日
You're welcome!

サインインしてコメントする。

その他の回答 (1 件)

Chris
Chris 2022 年 6 月 7 日
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

カテゴリ

Find more on Resizing and Reshaping 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