2

こんにちは、次のコードを使用して、「GPGGA」を含む行からいくつかの値を data.txt から読み取っています。

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);

data.txt の最後の行を削除すると、コードは完全に機能します。テキスト ファイルに最後の行が含まれている場合に、このエラーがスローされる理由がわかりません。理由は何ですか?よくわかりません!

"??? Error using ==> horzcat CAT 引数の次元が一貫していません。Error in ==> test at 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
4

1 に答える 1

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。また、フォーマット文字列を作成するときに列数を間違える可能性が低くなります:-)

于 2012-10-29T05:38:13.513 に答える