2012-10-28 4 views
2

안녕 내가 코드는 지난 경우 완벽하게 작동 data.txt로matlab에 textscan 잘못 사라 : cellfun는

fid = fopen('D:\data.txt','r'); 
A=textscan(fid,'%s %*s %f %s %f %s %*s %*s %*s %*s %*s %*s %*s %*s %*s,'Delimiter',','); 
fclose(fid); 
Loc = [A{[2, 4]}]; 
row_idxs = cellfun(@(s) strcmp(s, '$GPGGA'), A{1}); 
Loc = Loc(row_idxs, :); 
display(Loc); 

에서 'GPGGA'를 포함하는 라인에서 일부 값을 읽기 위해 다음 코드를 사용하고 특정 라인에서 데이터를 선택 data.txt의 행이 h 제됩니다. 최종 줄이 텍스트 파일에 포함되어있을 때 왜이 오류가 발생하는지 확실하지 않습니다. 그 이유는 무엇입니까? 나는 혼란스러워!

"??? 오류 ==> horzcat CAT 인수 사이즈가 일치하지 않는 오류가 사용 ==> 시험 = 4 은 Loc에서 [A {[2,4]}]."

data.txt로

$GPGSV,4,1,16,05,15,046,23,29,47,071,21,16,31,291,18,31,39,202,18*73 
$GPGSV,4,1,16,05,15,046,23,29,47,071,21,16,31,291,18,31,39,202,18*73 
$GPGSV,4,1,16,05,15,046,23,29,47,071,21,16,31,291,18,31,39,202,18*73 
$GPGSV,4,1,16,05,15,046,23,29,47,071,21,16,31,291,18,31,39,202,18*73 
$GPGSV,4,2,16,23,13,298,17,25,15,119,17,06,22,247,16,03,04,251,14*75 
$GPGSV,4,2,16,23,13,298,17,25,15,119,17,06,22,247,16,03,04,251,14*75 
$GPGSV,4,2,16,23,13,298,17,25,15,119,17,06,22,247,16,03,04,251,14*75 
$GPGSV,4,2,16,23,13,298,17,25,15,119,17,06,22,247,16,03,04,251,14*75 

$GPGGA,1.8,98.90,S,18.0014,E,1,04,1.0,87.8,M,48.0,M,,*76 
$GPGGA,1.3,98.91,S,18.0015,E,1,04,1.0,100.7,M,48.0,M,,*40 
$GPGGA,1.3,98.92,S,18.0016,E,1,04,1.0,105.4,M,48.0,M,,*4F 
$GPGGA,1.8,98.93,S,18.0017,E,1,04,1.0,87.8,M,48.0,M,,*76 
$GPGGA,1.8,98.94,S,18.0018,E,1,04,1.0,87.8,M,48.0,M,,*76 
$GPGSV,4,4,16,27,,,,26,,,,24,,,,22,,,*79 
+0

내 대답에 도움이 되었습니까? 그렇다면 답을 표시하십시오. 그렇지 않으면, 내가 명확하지 않은 것을 알려주고 답을 향상 시키려합니다. 감사. –

+0

그것은 참으로! 고마워요! laaaaaaaaaate 답장 죄송합니다! – user1658248

답변

1

귀하의 형식 문자열은 좋지 않습니다. 그것은 단지 15 열을 나타냅니다. 게시 한 샘플 데이터에는 20 개의 열이 있습니다. 내가 대신 (내 컴퓨터에 오류없이 실행) 다음 코드를 사용하는 것이 좋습니다 :

fid = fopen('D:\data.txt','r'); 
A=textscan(fid,'%s %*s %f %s %f %s %*[^\n]', 'Delimiter',','); 
fclose(fid); 
Loc = [A{[2, 4]}]; 
row_idxs = cellfun(@(s) strcmp(s, '$GPGGA'), A{1}); 
Loc = Loc(row_idxs, :); 
display(Loc); 

주 내 형식 문자열의 구조 %*[^\n]합니다. 그러면 textscan은이 시점부터 모든 열을 무시합니다. 그것은 %*s을 반복하여 많이 쓰는 것보다 훨씬 더 깔끔합니다. 또한 형식 문자열을 작성할 때 열 개수를 잘못 계산할 가능성이 적음을 의미합니다.