2011-01-13 15 views

risposta

26

norm normalizza un vettore in modo che la sua somma dei quadrati sono 1.

Se si vuole normalizzare il vettore in modo che tutti i suoi elementi sono compresi tra 0 e 1, è necessario utilizzare il valore minimo e massimo, che puoi quindi usarlo per denormalizzare di nuovo.

%# 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

Come posso usare lo stesso codice per la normalizzazione tra 0 e 1? – Shyamkkhadka

+0

@Shyamkkhadka: usa il codice fornito da ScottG qui sotto, o usa '((vec-minVec) ./ (maxVec-minVec))' – Jonas

0

Una risposta estesa che è stata costruita sulla risposta di Jonas è sotto. Consente la normalizzazione automatica in base alla presenza di numeri negativi e positivi nel vettore o alla selezione manuale del tipo di normalizzazione desiderato. Sotto la funzione c'è uno script di test.

funzione Normalizzazione

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 per testare la funzione

% 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-date risposta potrebbe essere quella di utilizzare la funzione rescale introdotta in Matlab R2017b. Per normalizzare il vettore A alla gamma -1:1, che ci si esegue:

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

Si potrebbe annullare questa salvando il minimo e il massimo anticipo poi correre di nuovo ridimensionare:

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