2011-01-13 11 views
16

どのように範囲[-1;1]どの範囲ベクトルを非正規化/正規化するために[-1; 1]が速くなるため

にベクトルを正規化ことができ、私は、関数normを使用したいです。

また私は正規後ベクトルを非正規化する方法を知っていますか?あなたはそのすべての要素が0と1の間になるようにベクトルを正規化したい場合は、正方形のその合計は、あなたが最小値と最大値を使用する1.

必要があるように

答えて

26

normは、ベクトルを正規化し、そのこれを使用して再び非正規化することができます。

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

あなたは再び再スケール動作して事前に最小値と最大値を保存することで、これを元に戻すことができ0と1の間で正規化するには? – Shyamkkhadka

+0

@Shyamkkhadka:下記のScottGが提供するコードを使用するか、 '((vec-minVec)./(maxVec-minVec))' – Jonas

0

Jonasの回答に基づいて構築された拡張回答です。これは、ベクトルに負の数および正の数が存在するかどうかに基づいて自動化された正規化を可能にするか、または所望の正規化のタイプを手動で選択することを可能にする。関数の下にはテストスクリプトがあります。

正規化関数

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

をテストするための最新の答えは、MATLAB R2017bで導入rescale機能を使用することです。範囲-1:1にベクトルAを正規化するには、実行したい:

maxA = max(A(:)); 
minA = min(A(:)); 
A = rescale(A, -1, 1); 
% use the normalised A 
A = rescale(A, minA, maxA); 
関連する問題