2011-01-13 7 views

Antwort

26

norm normalisieren einen Vektor, so dass seine Summe der Quadrate sind 1.

Wenn Sie den Vektor normalisieren wollen, so dass alle seine Elemente sind zwischen 0 und 1, können Sie die Minimal- und Maximalwert verwenden müssen, die Sie können dann verwenden, um wieder zu denormalisieren.

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

Wie kann ich denselben Code verwenden zum Normalisieren zwischen 0 und 1? – Shyamkkhadka

+0

@Shyamkkhadka: Verwenden Sie den unten stehenden Code von ScottG oder verwenden Sie '((vec-minVec) ./ (maxVec-minVec))' – Jonas

0

Eine erweiterte Antwort, die auf der Antwort von Jonas aufgebaut wurde, ist unten. Es ermöglicht eine automatische Normalisierung, basierend darauf, ob negative oder positive Zahlen in dem Vektor vorhanden sind oder eine manuelle Auswahl des gewünschten Normalisierungstyps. Unterhalb der Funktion befindet sich ein Testskript.

Normalisierungsfunktion

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 die Funktion

% 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

Ein up-to-date testen Antwort die rescale Funktion eingeführt in Matlab R2017b zu verwenden wäre. Zur Normalisierung des Vektors A auf den Bereich -1:1, dann würden Sie laufen:

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

Sie könnten dies rückgängig machen, indem die Mindesteinsparung und maximale vorher dann rescale läuft wieder:

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