2013-03-12 2 views
0

I 명령MATLAB - bsxfun 음수

X=bsxfun(@times,bsxfun(@minus,X,min(X,[],1)),1./max(X,[],1)) 

를 사용하여 데이터 세트를 정규화하고 대한 I는 두 개의 다른 데이터 세트에 함수를 시도했다. 하나는 음수 값을 가졌습니다. 다른 사람들은 그렇지 않았습니다. 음수 값이없는 데이터 세트는 0과 1 사이에서 완벽하게 정규화되었습니다. 그리고 음의 값을 가진 것이 제대로 정상화되지 않았습니다. 이 문제를 해결할 수 있습니까? 음수 값으로 데이터 세트를 정규화 할 수있는 다른 방법이 있습니까?

답변

3

범인은 정규화에 있습니다. 으로 나누는 대신 으로 나눕니다. 에서 min(X)을 뺍니다.

Y = bsxfun(@minus, X, min(X)); 
X_normalized = bsxfun(@rdivide, Y, max(Y)); 

참고이 어쨌든 제대로 작동하지 않았다,도 긍정적 인 위해도 음의 값을 두 단계로이 파괴되어 당신이 일을해야

. 더

몇 가지 참고 사항은 :

  1. min(X, [], 1)min(X) 단축 할 수있다. max도 마찬가지입니다.
  2. times을 사용하는 대신 1 ./ max(Y)을 곱하면 rdivide을 사용할 수 있습니다.

희망이 있습니다.

0

좋아,이 게시물은 정말 나를 방해.

나는 bsxfun에 대해 들어 본 적이 없다. arrayfun, cellfun, structfun을 사용하고있었습니다. 그래서 나는 그것을 사용하는 이유를 배회했고, 나는 스피드에서 나의 대답을 발견 할 것이라고 생각했다. 그래서 나는 바보 테스트했다 :

X = magic(3); 
tic 
Y = bsxfun(@minus, X, min(X(:))); 
X_normalized = bsxfun(@rdivide, Y, max(Y(:))); 
toc 

tic 
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X); 
toc 

을 그리고 난 대답을 얻었다 :

Elapsed time is 0.004130 seconds. 
Elapsed time is 0.002468 seconds. 

, arrayfun가 갈 수있는 방법이라고 나 일을했다. 그러나 X가 작은 데이터이므로 arrayfun이 더 빠르기 때문에 더 큰 X (X = magic(100);)로 시도했습니다. 그리고 확실히, bsxfun은 훨씬 빨라서 어떤 것을 다시 코딩해야합니다. 내가 테스트를 여러 번 실행하기로 결정 결과에 충분 그러나 행복하지

Elapsed time is 0.003342 seconds. 
Elapsed time is 0.395347 seconds. 

그냥이 casuality의 아니었다 보장 할 수 있습니다. 그리고 여기가 불안해지기 시작합니다.

test= repmat({zeros(2,10)},2,1); 
Xsizes = [3 100]; 
for ii=1:2,for jj=1:10 
X = magic(Xsizes(ii)); 
tic 
Y = bsxfun(@minus, X, min(X(:))); 
X_normalized = bsxfun(@rdivide, Y, max(Y(:))); 
test{ii}(1,jj)=toc; 


tic 
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X); 
test{ii}(2,jj)=toc; 

end;end 

display('small Size data') 
test{1} 
display('Big Size data') 
test{2} 

그리고에 allways 빠를 작은 데이터 및 대용량 데이터에 대한 빠른 bsxfun에 대한 arrayfun 기대 대답. 그러나 두 경우 모두 bsxfun이 더 빠르며 처음 세트를 계산하는 데 더 많은 시간이 걸립니다.

small Size data 

ans = 

    1.0e-03 * 

    0.4900 0.0470 0.0430 0.0410 0.0410 0.0420 0.0420 0.0410 0.0420 0.0410 
    0.6600 0.4200 0.4040 0.3890 0.3920 0.3900 0.3920 0.3890 0.3960 0.3900 

Big Size data 

ans = 

    0.0003 0.0001 0.0001 0.0001 0.0001 0.0001 0.0002 0.0001 0.0001 0.0001 
    0.3853 0.3871 0.3846 0.3855 0.3874 0.3844 0.3863 0.3840 0.3860 0.3853 

이것은 나에게 당황 스럽다. for 루프 밖에서 X=magic(3)으로 다시 계산하면 bsxfun은 항상 arrayfun 이상을 소요합니다.

Elapsed time is 0.004891 seconds. 
Elapsed time is 0.002008 seconds. 



Elapsed time is 0.003181 seconds. 
Elapsed time is 0.001994 seconds. 



Elapsed time is 0.003109 seconds. 
Elapsed time is 0.002008 seconds. 

어떤 힌트가 있습니까?