octave, maxima 등을 이용한 실험 데이터의 조작 방법?
글쓴이: tombraid / 작성시간: 수, 2007/06/13 - 10:44오전
학교에서 실험한 데이터를 정리하려고 합니다.
실험 결과가 텍스트로 나와서 grep, paste, cut, sed 등으로 대충 정리는 했습니다.
간단히 gnuplot으로 그래프도 확인했구요.
그런데, 텍스트 파일로 떨어진 결과들에 대한 처리 작업을 하려고 하는데요.
찾아봤더니 octave나 maxima 등을 이용할 수 있다고 하던데, 어떻게 접근해야 할지 잘 모르겠네요.
간단히 구간평균정도를 구하는 샘플등을 구할 수 있을까요?
구간평균정도 구하는 샘플이면 수정해서 원하는 전처리가 가능할 것 같아서요.
Forums:
octave로
octave로 처리하려면,
우선 텍스트 파일의 포맷을 octave상의 배열로 바꿔야 하는데요.
(일단 배열로 바꾸고 나면 그 다음은 간단합니다.)
그 텍스트 파일의 (데이터) 형태를 알아야 도움을 드릴 수 있습니다.
(예를들면, 한 줄에 숫자가 하나씩 있다던지, 아니면 데이터 사이에는 공백문자가 있다던지.)
데이터는 X1(탭)Y1 X2(탭
데이터는
X1(탭)Y1
X2(탭)Y2
X3(탭)Y3
...
형태로 되어 있습니다.
참고로, X, Y 값은 소수점 둘째자리까지 값이 있습니다.
파일형식이
파일형식이 간단하니까 쉽게 될 것 같네요.
제 컴에 Octave가 안 깔려서 확인은 못했지만,
우선 Octave의 Path를 알아보죠.
>>> path()
path 중에 하나를 작업디렉터리로 정하세요.
파일이름을 data.txt로 만들고 작업디렉터리로 옮기세요.
그리고는,
>>> load data.txt
>> size(data)
출력 결과가 0이 아닌 결과가 나오면 성공입니다.
그 다음에,
>>> data(1,1)
>> data(1,2)
를 입력해서 X1, Y1값이 나오는지 확인하세요.
일단 여기까지 해보세요.
load시 경로를
load시 경로를 전체경로로 주니까 되네요.
변수명은 파일명에서 확장자를 뺀것으로 잡히는것 같네요.
% 먼저 구간의 크기를
% 먼저 구간의 크기를 정합니다.
% 구간의 크기를 10으로 하겠습니다.
d = 10; %구간크기
x = data(:,1);
n = length(x); % 데이터 갯수
m = floor(n/d) %구간의 갯수
temp_x = reshape(x(1:d*m),d,m); %2차원 배열로 바꿉니다.
average_x = sum(temp_x,1) / d; %평균구하기
y = data(:,2); %마찬가지로 y에 대해서도 할 수 있습니다.
temp_y = reshape(y(1:d*m),d,m);
average_y = sum(temp_y,1) / d;
이제 좀 대충 감이
이제 좀 대충 감이 잡히네요.
어떤 용어(매트릭스 랄까, 배열이랄까, 테이블이랄까??)를 쓰는지는 모르겠지만
하여튼 이런 형식의 데이터를 다루기 쉽게 되어있는것 같네요.
기왕 가르쳐 주시는거 마지막으로 한가지만 더 여쭐께요. ^^
처리된 데이터 average_x, average_y 를 이용해서 그래프를 그리려면 어떤 방법을 사용하나요?
p_data(:, 1) = average_x 이런식으로 원래 있던 데이터형태대로 만들어봤거든요.
save p_data 했더니 p_data를 저장하는게 아니라 p_data 라는 파일명에 전체 변수들의 값을 저장해 주더군요.
vi에서 약간만 처리하면 gnuplot의 데이터로 사용할 수 있을것 같기도 하지만 더 간단한 방법이 존재할 것 같아서요.
그래프
그래프 그리기
plot(1:m,average_x)
plot(1:m,average_y)
혹시 x,y가 각각 x,y 좌표를 나타내는 거라면,
plot(average_x,average_y)
한 가지 설명을 더 추가하면
위에서 한 방법은 Matlab(또는 Octave)답게 만든 거구요.
프로그래밍을 했던 사람이라면
for, if문 등을 이용해서 할 수도 있습니다.
다만, Matlab은 C와는 다르게 배열의 index가 1부터 시작합니다.
x = data(:,1);
n = length(x);
m = floor(n/d); %여기까지는 같습니다.
sum_x = zeros(1,m); % 영벡터를 할당합니다.
for i = 1:m*d
sum_x(1,floor((i-1)/d)+1) = sum_x(1,floor((i-1)/d)+1) + x(i,1)
end
average_x = sum_x / d;
방식은 다르지만 결과는 위와 똑같게 나옵니다.
아마도 이 방식이 더 쉽게 느껴지실 겁니다.
감사합니다. 이제
감사합니다. 이제 어느정도 사용할 수 있을것 같네요.
한스텝한스텝 가르쳐 주셔서 과외 받는 기분이었습니다.
다시 한번 감사드립니다.
댓글 달기