2014-05-08 4 views
3

Matlab에 배열로로드하려는 라인마다 다양한 양의 데이터 파일을 가지고 있습니다. 예를 들어, 내가 모든 회선을 통해 루프를 수행하여이 작업을 수행 할 수 있습니다 Matlab - 다양한 라인 길이를 가진 파일 읽기

1 2 nan nan 
3 4 5 6 
7 nan nan nan 
8 9 10 nan 

과 같은 배열로 matlab에로를 읽을 수
1 2 
3 4 5 6 
7 
8 9 10 

같은 데이터 파일이 보이는 가정 파일이지만 내 파일은 매우 커서 효율적인 솔루션을 찾고 있습니다. 어떤 아이디어든지 높게 평가 될 것입니다. 도움이된다면 파일 전체의 최대 줄 길이에 대한 상한도 알고 있습니다.

+1

당신이 우리가 할 수있는'textread' – bla

+1

예를 가까이 당신이 필요로 여기에 표시된 예를 살펴해야합니다 http://stackoverflow.com/questions/14158165/읽기 - 블록 - 중 - 데이터 -에 - matlab에 배열 – beedot

답변

2

Divakar의 대답은 당신이 당신의 텍스트 파일에 제로의 값이없는 경우, 즉 일반적으로 케이스하지 않을 수의 작품이지만. 예를 들어, 텍스트 배열 경우였다

1 2 3 
4 0 
5 6 0 7 8 

다음 Divakar의 결과는 다음과 같습니다

1 2 3 nan nan 
4 nan nan nan nan 
5 6 nan 7 8 

당신이 정말로 원하는 반면 :

1 2 3 nan nan 
4 0 nan nan nan 
5 6 0 7 8 

이를 구현하는 가장 쉬운 방법은 최대 열 수 있습니다 dlmread 기능 (dlmread를 텍스트 편집기에 입력하고 Ctrl + D를 눌러 열어보십시오). 이 파일을 다른 이름 (예 : dlmread_nan.m)으로 ​​작업중인 디렉토리에 별도의 파일로 저장하십시오.

if isempty(delimiter) 
    result = textscan(fid,'',nrows,'headerlines',r,'headercolumns',c,... 
         'returnonerror',0,'emptyvalue',0, 'CollectOutput', true); 
else 
    delimiter = sprintf(delimiter); 
    whitespace = setdiff(sprintf(' \b\t'),delimiter); 
    result = textscan(fid,'',nrows,... 
        'delimiter',delimiter,'whitespace',whitespace, ... 
        'headerlines',r,'headercolumns',c,... 
        'returnonerror',0,'emptyvalue',0,'CollectOutput', true); 
end 

을 0으로 파일을 저장하는 대신 NaN이에 두 경우 모두 'emptyvalue'이후의 값을 변경 :

코드 (내 버전의 라인 126)의이 부분을 아래로 이동합니다. 그것은 다음과 같아야합니다

if isempty(delimiter) 
    result = textscan(fid,'',nrows,'headerlines',r,'headercolumns',c,... 
         'returnonerror',0,'emptyvalue',NaN, 'CollectOutput', true); 
else 
    delimiter = sprintf(delimiter); 
    whitespace = setdiff(sprintf(' \b\t'),delimiter); 
    result = textscan(fid,'',nrows,... 
        'delimiter',delimiter,'whitespace',whitespace, ... 
        'headerlines',r,'headercolumns',c,... 
        'returnonerror',0,'emptyvalue',NaN,'CollectOutput', true); 
end 

당신의 배열을 얻으려면, 이것을 사용 :

result = dlmread_nan('text.txt', ' '); 
%%//This will give you exactly what you're looking for. 

을 조금 복잡하지만 MATLAB의 라이브러리에서 복사하여, 그것은 아마 훨씬 더 강력하고 있습니다 처음부터 쓰는 것보다 오류가 없다.

+0

+1. 좋은 제안. – rayryeng

+0

데이터에 제로가있는 경우 솔루션을 추가 했으므로 내 솔루션을 참조하는 곳에서 답변을 편집 할 수 있습니다. :) – Divakar

2

사례 1 : 없음 제로와 데이터

이 기술은 본질적으로 0으로 빈 곳을 변환 dlmread를 사용하고 우리가 원하는 출력을 얻기 위해 필요에 따라하는 NaN로 사람들을 변환해야합니다.

코드

out = dlmread(textfile_path, ' ') %%// textfile_path is path to your text file 
out(out==0)=NaN %%// out is your desired output 

입력

1 2 
3 4 5 6 
7 
8 9 10 

출력

out = 
    1  2 NaN NaN 
    3  4  5  6 
    7 NaN NaN NaN 
    8  9 10 NaN 

사례 2 : 제로와 데이터 따라서 warrantes 각별한주의가 주변에있는 그대로 0을 보존 세포의 열 배열에 textscan를 사용하여 데이터를 가져 오기에 회귀하는 제로

이러한 접근 방식을 보존과 NaN으로 빈 곳을하게합니다. 유일한 문제는 마지막 줄에 빈 자리가 없기 때문에 (마지막 줄이 길지 않은 경우) 길이가 줄 수와 같지 않다는 것입니다. 동일한 경우, 추가 코드가 거의 필요 없습니다.

접근법 1 :

코드

fid = fopen(textfile_path,'r'); %%// textfile_path is path to your text file 
data1 = textscan(fid,''); 
fclose(fid); 

lens = cellfun(@numel,data1) 
out = NaN(max(lens),numel(lens)) %%// out will be your output 
for k = 1:numel(lens) 
    out(1:lens(k),k) = data1{:,k} 
end 

접근법 2 (짧은 버전)

코드

fid = fopen(textfile_path,'r'); %%// textfile_path is path to your text file 
data1 = textscan(fid,''); 
fclose(fid); 

n1 = find(diff(cellfun(@numel,data1))~=0) 

%%// out will be your output 
out = [horzcat(data1{:,[1 n1]}) [horzcat(data1{:,[n1+1:end]}) ; NaN(1,numel(data1)-n1)]] 
01 23,516,

입력

1 2 3 
4 0 
5 6 0 7 8 
0 0 

출력

out = 
    1  2  3 NaN NaN 
    4  0 NaN NaN NaN 
    5  6  0  7  8 
    0  0 NaN NaN NaN 
+1

감사합니다 Divakar.textread는 내 용도로 충분하지만 나중에 참조 할 수 있도록이 책을 북마크에 추가합니다. – Dinesh

0

이 경우?

입력

1 2 3 6 
4 5 
1 0 7 8 
0 0  5 

어떻게 할?

Textscan는 숫자 위치를 유지하지 않기 때문에 위험 할 것