matlab - Cómo normalizar/desnormalizar un vector al rango
normalization denormalization (4)
¿Cómo puedo normalizar un vector al rango [-1;1]
Me gustaría usar la norm
función, porque será más rápida.
¿También hágame saber cómo puedo desnormalizar ese vector después de la normalización ?
A continuación se encuentra una respuesta extendida que fue construida sobre la respuesta de Jonas. Permite la normalización automatizada en función de si hay números negativos y positivos en el vector o la selección manual del tipo de normalización deseada. Debajo de la función hay un script de prueba.
Función de normalización
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
Script para probar la función.
% 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]'')
Una respuesta actualizada sería utilizar la función de rescale
introducida en Matlab R2017b. Para normalizar el vector A
en el rango -1:1
, ejecutarías:
A = rescale(A, -1, 1);
Puede deshacer esto guardando el mínimo y el máximo de antemano y luego ejecutando reescala nuevamente:
maxA = max(A(:));
minA = min(A(:));
A = rescale(A, -1, 1);
% use the normalised A
A = rescale(A, minA, maxA);
Una solución simple es usar la función MATLAB lista:
mapminmax
Procese las matrices asignando los valores mínimo y máximo de la fila a [-1 1]
Ejemplo:
x1 = [1 2 4; 1 1 1; 3 2 2; 0 0 0]
[y1,PS] = mapminmax(x1)
Desnormalizar ese vector después de la normalización.
x1_again = mapminmax(''reverse'',y1,PS)
norm
normaliza un vector de modo que su suma de cuadrados sea 1.
Si desea normalizar el vector para que todos sus elementos estén entre 0 y 1, debe usar el valor mínimo y máximo, que luego puede usar para desnormalizar nuevamente.
%# 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