MATLAB Answers

How to scale/normalize values in a matrix to be between -1 and 1

753 views (last 30 days)
Avi
Avi on 8 Sep 2014
Answered: Steven Lord on 1 Aug 2019
I found the script that scale/normalize values in a matrix to be between 0 and 1
I = [ 1 2 3; 4 5 6]; % Some n x m matrix I that contains unscaled values.
scaledI = (I-min(I(:))) ./ (max(I(:)-min(I(:))));
min(scaledI(:)) % the min is 0
max(scaledI(:)) % the max 1
Was wondering if anyone could help me normalize values in matrix between -1 and +1 Thanks

  0 Comments

Sign in to comment.

Accepted Answer

José-Luis
José-Luis on 8 Sep 2014
Edited: José-Luis on 8 Sep 2014
Once you have your result:
scaledl = scaledl.*2 - 1;
Or directly:
result = -1 + 2.*(data - min(data))./(max(data) - min(data));

  2 Comments

Robert Hus
Robert Hus on 13 Apr 2017
if you have an unequal spread of your data between positive and negative numbers, than the above solution may revert the sign of your array mean. To honour the original spread of positive and negative values (e.g if your smallest negative number is -20 and your largest positive number is +40) you can use the following function. Using this function the -20 will become -0.5 and the +40 will be +1. The solution above has the -20 equates to -1 and +40 to +1.
function norm_value = normalised_diff( data )
% Normalise values of an array to be between -1 and 1
% original sign of the array values is maintained.
if abs(min(data)) > max(data)
max_range_value = abs(min(data));
min_range_value = min(data);
else
max_range_value = max(data);
min_range_value = -max(data);
end
norm_value = 2 .* data ./ (max_range_value - min_range_value);
end

Sign in to comment.

More Answers (2)

JAY R
JAY R on 3 May 2015
Edited: JAY R on 3 May 2015
function data = normalize(d)
% the data is normalized so that max is 1, and min is 0
data = (d -repmat(min(d,[],1),size(d,1),1))*spdiags(1./(max(d,[],1)-min(d,[],1))’,0,size(d,2),size(d,2));
taken from here

  0 Comments

Sign in to comment.


Steven Lord
Steven Lord on 1 Aug 2019
If you're using release R2018a or later, use the normalize function. Specify 'range' as the method and the range to which you want the data normalized (in this case [-1, 1]) as the methodtype.
x = 5*rand(1, 10)
n = normalize(x, 'range', [-1 1])
[minValue, maxValue] = bounds(n) % Should return -1 and 1

  0 Comments

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!