2011-01-13 7 views
16

मैं कैसे रेंज [-1;1]कैसे को सामान्य बनाने में/एक सदिश denormalize लेकर [-1, 1]

मैं समारोह norm उपयोग करना चाहते हैं के लिए एक वेक्टर सामान्य कर सकते हैं, क्योंकि यह तेजी से हो जाएगा।

इसके अलावा मुझे पता है कि मैं कैसे कि सामान्य के बाद सदिश denormalize कर सकते हैं?

उत्तर

26

norm एक सदिश को सामान्य ताकि वर्गों की अपनी योग होते हैं 1.

आप वेक्टर को सामान्य बनाने में इतना है कि इसके सभी तत्वों 0 और 1 के बीच हैं, तो आप न्यूनतम और अधिकतम मूल्य, उपयोग करने की आवश्यकता चाहते हैं जो फिर आप फिर से denormalize करने के लिए उपयोग कर सकते हैं।

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

मैं एक ही कोड का उपयोग कैसे कर सकते हैं:

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

आप न्यूनतम और अधिकतम बचत पहले से उसके बाद फिर से rescale चलाकर इस पूर्ववत सकता है 0 और 1 के बीच सामान्यीकरण के लिए? – Shyamkkhadka

+0

@Shyamkkhadka: नीचे स्कॉटजी द्वारा प्रदान किए गए कोड का उपयोग करें, या '((vec-minVec) ./ (maxVec-minVec) का उपयोग करें)' – Jonas

0

जोनास द्वारा उत्तर पर बनाया गया एक विस्तारित उत्तर नीचे दिया गया है। यदि वे वांछित सामान्यीकृत प्रकार के वेक्टर या मैन्युअल चयन में नकारात्मक और सकारात्मक संख्या मौजूद हैं, तो यह स्वचालित सामान्यीकरण के लिए अनुमति देता है। फ़ंक्शन के नीचे एक टेस्ट स्क्रिप्ट है।

सामान्यीकरण समारोह

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]') 
0

परीक्षण करने के लिए एक अप-टू-डेट जवाब rescale समारोह मैटलैब R2017b में पेश उपयोग करने के लिए किया जाएगा। रेंज -1:1 के लिए वेक्टर A को सामान्य करने के लिए आप चलाने चाहते हैं:

maxA = max(A(:)); 
minA = min(A(:)); 
A = rescale(A, -1, 1); 
% use the normalised A 
A = rescale(A, minA, maxA); 
संबंधित मुद्दे