जोनास द्वारा उत्तर पर बनाया गया एक विस्तारित उत्तर नीचे दिया गया है। यदि वे वांछित सामान्यीकृत प्रकार के वेक्टर या मैन्युअल चयन में नकारात्मक और सकारात्मक संख्या मौजूद हैं, तो यह स्वचालित सामान्यीकरण के लिए अनुमति देता है। फ़ंक्शन के नीचे एक टेस्ट स्क्रिप्ट है।
सामान्यीकरण समारोह
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]')
मैं एक ही कोड का उपयोग कैसे कर सकते हैं:
आप न्यूनतम और अधिकतम बचत पहले से उसके बाद फिर से rescale चलाकर इस पूर्ववत सकता है 0 और 1 के बीच सामान्यीकरण के लिए? – Shyamkkhadka
@Shyamkkhadka: नीचे स्कॉटजी द्वारा प्रदान किए गए कोड का उपयोग करें, या '((vec-minVec) ./ (maxVec-minVec) का उपयोग करें)' – Jonas