2014-11-25 7 views
0

데이터의 범위는 0에서 1e5 (마이크로 초)입니다. 나는 0.05 마이크로 초 동안 연속적으로 2.68 마이크로 초의 비닝을위한 히스토그램을 만들고 모든 히스토그램을 축적하려고한다. 나는 다음과 같은 시도를했다 :히스토그램을 축적하는 방법은 무엇입니까?

a=load('Data.dat') 
Range=2.68; % For every successive 2.68micro seconds, I want to plot histogram 
n= max(a)/Range; % This tells how many such ranges will be in the data 
low=min(a); 
high=min(a)+Range; 
x=low:0.05:high; 
y=hist(a,x);% This is the first histogram for the first 2.68 microsecond 
figure 
semilogy(x,y,'-ob') 

for num=1:1:n-1 % This loop is to make histogram for successive 2.68 microseconds 
low=low+Range; 
high=high+Range; 
x=low:0.05:high; 
y=y+hist(a,x-low); % This (I AM NOT SURE) is intended to accumulate the histogram for each loop. 
end 

figure 
semilogy(x-low,y,'-or'); % Final accumulated histogram. 

이것은 내가 만든 프로그램이다. 그러나 히스토그램은 루프가 실행될 때마다 누적되지 않습니다. 누구든지 히스토그램을 누적하도록 도와 줄 수 있습니까? 또는 연속 범위에 대한 막대 그래프를 축적하는 다른 더 좋은 방법은 없을까요?

+0

을 수행해야합니다. 'hist (a, x-low)'는 루프 반복마다 일정하게 유지됩니까? 매번 정확한 숫자를 가진 함수를 호출하고 있습니다. –

+0

@AnderBiguri : 마지막으로 히스토그램을 누적 할 때 x 축을 맞추기 위해 x-low를 사용하고 있습니다. 보시다시피, 각 루프 이후 x 값은 2.68 마이크로 초 범위 앞으로 이동합니다. 상단에 누적하기 위해 (누적) x 값은 각 루프 이후에 조정되어야합니다. 제가 알고 싶은 것은 '연속 2.68 마이크로 초마다 무슨 일이 일어나고 있습니까?'라는 것입니다. 따라서 연속적인 2.8 마이크로 초의 히스토그램을 축적해야합니다. – Aneps

+0

@AnderBiguri : 매번 실행 한 후에 히스토그램을 축적하는 다른 방법이 더 있는지 잘 모르겠습니다. 다른 방법이 있다면 나에게 제안 해주세요. 고맙습니다. – Aneps

답변

2

당신은 그것을하지 않습니다 rigth. 당신이 제대로하지 못하고있는 몇 가지가 있습니다 :

첫째, a 조각의 수를 제대로 계산되지 않습니다. 당신이해야 할 조각의 양을 알기 위해서는 데이터의 주파수가 필요합니다.

freq=0.05; %seeing your comments 
n=numel(a)*freq/Range; 
nindexRange=Range/freq; %how many data is in each Range 

이렇게하면 계산할 조각 수를 알 수 있습니다. 그러나 이것은 일반적으로 정수가 아닐 것입니다. 우리는 또한 그것을 고려해야합니다.

lastpiece=numel(a)-floor(n)*nindexRange; 
% This gives us how many elements are we leaving for the last calculation 

따라서

n=floor(n); %round it to the lowest 

는 이제 데이터의 조각을 얻을, ADN 값 같은 양의 위해에 대한 히스토그램을 계산하려면 n은 정수 할 수 있습니다. 10 개의 빈 (bin)이있는 히스토그램을 원한다고합시다.

nbins=10; 
bins=linspace(min(a),max(a),nbins); 

이제 우리는 우리가 히스토그램가 계산하려는 느릅 나무의 a의 값을 정의했습니다. 루프를 허용하십시오.

for ii=1:n 
    y=y+hist(a(1 + (ii-1)*nindexRange : nindexRange*ii) , bins); 
end 

그래서 우리는 무엇을하고 있습니까? 우리는 각 반복마다 a 조각을 가져 가고 있으며, 항상 동일한 저장소의 막대 그래프를 얻습니다 (다른 점은 누적되지 않습니다). 그렇다면 데이터에 어떻게 접근합니까? (1 + (ii-1)*nindexRange : nindexRange*ii) 그것을 정렬하려고하면 매우 어렵습니다;).

하지만 오! 우리는 우리가 약간의 데이터를 남겼다는 것을 잊는다! (n 개의 정수가 아니기 때문에!)

따라서

if laspiece~=0 
    y=y+hist(a(end-laspiece:end),bins); % take the last "lastpeice" amount of points 
end 

이 내가 당신이 원하는 것을 확실하지 않다 트릭

+0

감사합니다. 그러나 두 가지 문제가 있습니다. 1) 최종 히스토그램은 누적 된 막대 그래프가 아닙니다! 히스토그램은 원래 데이터를 되돌리기 위해 함께 비닝하는 것 같습니다! 문제는 y = y + hist (a (1 + (ii-1) * nindexRange : nindexRange * ii), bins)에서 발생한다고 생각합니다. 여기서는 하나씩 누적하는 대신 하나씩 차례로 비닝합니다. 최종 히스토그램은 모든 히스토그램 (연속적인 'Range'에 대해 얻어진 히스토그램)의 누적 일 것으로 예상됩니다. – Aneps

+0

2) 마지막 'if 루프'의 오류 : a (5057.71); 인덱스는 양수 또는 논리 여야합니다. – Aneps

+0

1) 실제로 누적 히스토그램. 'hist'의 결과는 정의 된 각 bin에있는 데이터의 양입니다. 당신이 이해하지 못하는 것이 확실하지 않습니다. 당신이 원하는 것은 히스토그램인가요? 2) 실제로 함수에서 오자가 있지만 작동해야합니다. –

관련 문제