2011-01-13 61 views

Respuesta

26

norm normaliza un vector de modo que su suma de los cuadrados son 1.

Si desea normalizar el vector de modo que todos sus elementos están entre 0 y 1, es necesario utilizar el valor mínimo y máximo, que puedes 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 
+0

¿Cómo puedo usar mismo código para normalizar entre 0 y 1? – Shyamkkhadka

+0

@Shyamkkhadka: utilice el código provisto por ScottG a continuación, o use '((vec-minVec) ./ (maxVec-minVec))' – Jonas

0

Una respuesta extendida que se basó en la respuesta de Jonas está a continuación. Permite la normalización automatizada en función de si los números negativos y positivos están presentes en el vector o la selección manual del tipo de normalización deseado. 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]') 
0

un up-to-fecha de respuesta sería utilizar la función rescale introducido en Matlab R2017b. Para normalizar el vector A a la gama -1:1, que había corrido:

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

Se puede deshacer la acción de guardar el mínimo y el máximo de antemano a continuación, ejecutar de nuevo reescalar:

maxA = max(A(:)); 
minA = min(A(:)); 
A = rescale(A, -1, 1); 
% use the normalised A 
A = rescale(A, minA, maxA); 
Cuestiones relacionadas