Как нормализовать / денормализовать вектор в диапазоне [-1; 1] - PullRequest
16 голосов
/ 13 января 2011

Как мне нормализовать вектор в диапазоне [-1;1]

Я бы хотел использовать функцию norm, потому что она будет быстрее.

Также дайте мне знать, как я могу денормализовать этот вектор после нормализации ?

Ответы [ 4 ]

26 голосов
/ 13 января 2011

norm нормализует вектор, так что его сумма квадратов равна 1.

Если вы хотите нормализовать вектор так, чтобы все его элементы находились в диапазоне от 0 до 1, вам необходимо использовать минимальное и максимальное значение, которое затем можно использовать для повторной денормализации.

%# generate some vector
vec = randn(10,1);

%# get max and min
maxVec = max(vec);
minVec = min(vec);

%# normalize to -1...1
vecN = ((vec-minVec)./(maxVec-minVec) - 0.5 ) *2;

%# to "de-normalize", apply the calculations in reverse
vecD = (vecN./2+0.5) * (maxVec-minVec) + minVec
0 голосов
/ 28 июня 2018

Простое решение использует готовую функцию MATLAB:

mapminmax

Обработка матриц путем сопоставления минимальных и максимальных значений строки с [-1 1]

Пример:

x1 = [1 2 4; 1 1 1; 3 2 2; 0 0 0]
[y1,PS] = mapminmax(x1)

Денормализовать этот вектор после нормализации

x1_again = mapminmax('reverse',y1,PS)
0 голосов
/ 27 февраля 2018

Современный ответ будет состоять в использовании функции rescale, представленной в Matlab R2017b.Чтобы нормализовать вектор A в диапазоне -1:1, вы должны выполнить:

A = rescale(A, -1, 1);

. Вы можете отменить это, предварительно сохранив минимальное и максимальное значения, а затем снова выполнить масштабирование:

0 голосов
/ 09 марта 2017

Расширенный ответ, который был основан на ответе Джонаса, приведен ниже. Это позволяет автоматизировать нормализацию на основе наличия отрицательных и положительных чисел в векторе или ручного выбора желаемого типа нормализации. Под функцией находится тестовый скрипт.

Функция нормализации

function [vecN, vecD] = normVec(vec,varargin)
% Returns a normalize vector (vecN) and "de-nomralized" vector (vecD). The
% function detects if both positive and negative values are present or not
% and automatically normalizes between the appropriate range (i.e., [0,1],
% [-1,0], or [-1,-1].
% Optional argument allows control of normalization range:
% normVec(vec,0) => sets range based on positive/negative value detection
% normVec(vec,1) => sets range to [0,1]
% normVec(vec,2) => sets range to [-1,0]
% normVec(vec,3) => sets range to [-1,1]

%% Default Input Values
% Check for proper length of input arguments
numvarargs = length(varargin);
if numvarargs > 1
    error('Requires at most 1 optional input');
end

% Set defaults for optional inputs
optargs = {0};

% Overwrite default values if new values provided
optargs(1:numvarargs) = varargin;

% Set input to variable names
[setNorm] = optargs{:};

%% Normalize input vector
% get max and min
maxVec = max(vec);
minVec = min(vec);

if setNorm == 0
    % Automated normalization
    if minVec >= 0
        % Normalize between 0 and 1
        vecN = (vec - minVec)./( maxVec - minVec );
        vecD = minVec + vecN.*(maxVec - minVec);
    elseif maxVec <= 0
        % Normalize between -1 and 0
        vecN = (vec - maxVec)./( maxVec - minVec );
        vecD = maxVec + vecN.*(maxVec - minVec);
    else
        % Normalize between -1 and 1
        vecN = ((vec-minVec)./(maxVec-minVec) - 0.5 ) *2;
        vecD = (vecN./2+0.5) * (maxVec-minVec) + minVec;
    end
elseif setNorm == 1
    % Normalize between 0 and 1
    vecN = (vec - minVec)./( maxVec - minVec );
    vecD = minVec + vecN.*(maxVec - minVec);
elseif setNorm == 2
    % Normalize between -1 and 0
    vecN = (vec - maxVec)./( maxVec - minVec );
    vecD = maxVec + vecN.*(maxVec - minVec);
elseif setNorm == 3
    % Normalize between -1 and 1
    vecN = ((vec-minVec)./(maxVec-minVec) - 0.5 ) *2;
    vecD = (vecN./2+0.5) * (maxVec-minVec) + minVec;
else
    error('Unrecognized input argument varargin. Options are {0,1,2,3}');
end

Скрипт для проверки функции

% Define vector
x=linspace(0,4*pi,25);
y = sin(x);
ya=sin(x); yb=y+10; yc=y-10;

% Normalize vector
ya0=normVec(ya); yb0=normVec(yb); yc0=normVec(yc);
ya1=normVec(ya,1); yb1=normVec(yb,1); yc1=normVec(yc,1);
ya2=normVec(ya,2); yb2=normVec(yb,2); yc2=normVec(yc,2);
ya3=normVec(ya,3); yb3=normVec(yb,3); yc3=normVec(yc,3);

% Plot results
figure(1)
subplot(2,2,1)
plot(x,ya0,'k',x,yb0,'ro',x,yc0,'b^')
title('Auto Norm-Range')
subplot(2,2,2)
plot(x,ya1,'k',x,yb1,'ro',x,yc1,'b^')
title('Manual Norm-Range: [0,1]')
subplot(2,2,3)
plot(x,ya2,'k',x,yb2,'ro',x,yc2,'b^')
title('Manual Norm-Range: [-1,0]')
subplot(2,2,4)
plot(x,ya3,'k',x,yb3,'ro',x,yc3,'b^')
title('Manual Norm-Range: [-1,1]')
...