Error with Min-Max Scaling

조회 수: 9 (최근 30일)
Kyle Koutonen
Kyle Koutonen 2021년 4월 25일
댓글: Steven Lord 2021년 4월 25일
The code below fails due to line 5, Just trying to make simple min max scaling code in range of -1 and 1
t=[ 1 5 6; 8 9 7; 2 4 5];
for i= 1:length(t)
Scale1=(t(:,i)-min(t(:,i)))/(max(t(:,i))-min(t(:,i)));
Scalef(i)=2*Scale1 -1
end
Scaled_data=Scalef

채택된 답변

Tayyab Khalil
Tayyab Khalil 2021년 4월 25일
First thing, kindly post your code inside a code block to make it easier to read.
I got your code working by simply assigning the scaled value to a column of scalef, the error was that you were trying to assign it as if it were a single value but it is not.
t=[ 1 5 6; 8 9 7; 2 4 5];
for i= 1:length(t)
Scale1=(t(:,i)-min(t(:,i)))/(max(t(:,i))-min(t(:,i)));
Scalef(:,i)=2*Scale1 -1
end
Scaled_data=Scalef
Which gives the following output:
Scaled_data =
-1.0000 -0.6000 0
1.0000 1.0000 1.0000
-0.7143 -1.0000 -1.0000
I don't know if this is what you're looking for, seems to be scaling each column between -1 and 1.
  댓글 수: 1
Kyle Koutonen
Kyle Koutonen 2021년 4월 25일
Your code did do exactly what i wanted, and yes I want to scale each row of data. The only porblem is when i implement it into matlab app.designer it no longer works. The code doesn't change, just t changes to app.t since that where the saved data is yet the Scale1 line brings up this error "Index in position 2 exceeds array bounds (must not exceed 2)" what would I need to change
for i= 1:length(app.t )
Scale1=(app.t(:,i)-min(app.t(:,i)))/(max(app.t(:,i))-min(app.t(:,i )));
Scalef(:,i)=2*Scale1 -1
%t2(:,i) = normalize(t(:,i), 'range', [-1 1 ]) ;
end
Scaled_data=Scalef

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Steven Lord
Steven Lord 2021년 4월 25일
t = [ 1 5 6; 8 9 7; 2 4 5]
t = 3×3
1 5 6 8 9 7 2 4 5
t2 = normalize(t, 'range', [-1 1])
t2 = 3×3
-1.0000 -0.6000 0 1.0000 1.0000 1.0000 -0.7143 -1.0000 -1.0000
You can also specify a dimension input.
t3 = normalize(t, 2, 'range', [-1 1])
t3 = 3×3
-1.0000 0.6000 1.0000 0 1.0000 -1.0000 -1.0000 0.3333 1.0000
  댓글 수: 2
Kyle Koutonen
Kyle Koutonen 2021년 4월 25일
Your code did do exactly what i wanted, and yes I want to scale each row of data. The only porblem is when i implement it into matlab app.designer it no longer works. The code doesn't change, just t changes to app.t since that where the saved data is yet the t2 line brings up this error "Index in position 2 exceeds array bounds (must not exceed 2)" what would I need to change
for i= 1:length(app.t )
t2(:,i) = normalize(app.t(:,i), 'range', [-1 1 ]) ;
end
Scaled_data=t2
app.UITable5.ColumnName= app.s;
app.UITable5.Data=Scaled_data;
Steven Lord
Steven Lord 2021년 4월 25일
Don't use length on a non-vector especially when you want to iterate over the columns of an array.
M = zeros(5, 4);
L = length(M)
L = 5
In this case L is the number of rows in M rather than the number of columns.
numRows = size(M, 1)
numRows = 5
numCols = size(M, 2)
numCols = 4
% If using a sufficiently recent MATLAB
numRows2 = height(M)
numRows2 = 5
numCols2 = width(M)
numCols2 = 4
In this other case, where M2 has more columns than rows, L2 is the number of columns in M2. But size, height, and width will always return the size in a specific dimension regardless of whether the array is a vector, a tall matrix, a wide matrix, or an N-dimensional array.
M2 = zeros(3, 17);
L2 = length(M2)
L2 = 17

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by