0

.mファイル(testin1.m)を配列に読み込んで、特定の単語('auto')を検索するための短いコードを書き込もうとしています。一致するものが見つかった場合は削除します。私は次のコードを持っています、私の間違いを理解するのを手伝ってください。

fid = fopen('testin1.m');
 txt = textscan(fid,'%s');
fclose(fid);
m_file_idx = 1;
data=['auto'];
B=cellstr(data);
 for idx = i : length(txt)
 A=txt{i};
 is_auto=isequal(A, B);
 if is_auto==0
 txt{i}=[];
 end
end

txt {i} = autoの場合、その行を削除する必要があります。

4

3 に答える 3

2

これは私が何度も何度も何度もヒットしたエラーです:

を設定txt(i) = []すると、配列の長さが変更されます。forループ条件は無効になりました。

より良いオプションは、強力なインデックス機能を使用することです。

A(find(condition)) = [];

または長さの変化を説明します:

A(i) = [];
i--; % <-- or i++, it is too early to think, but you get the idea

A編集:あなたがあなたのプログラムでも使用していることに気づきました。私の名前はランダムな変数名であり、使用しているAとは異なります。

于 2013-01-04T14:55:15.550 に答える
2

AK4749の答えは、どこが間違っていたかを示すのに絶対に正しいです。私はあなたに別の解決策を追加しますが、それはもっと短いです:

C = textread('testin1.m', '%s', 'delimiter', '\n');
C = C(cellfun(@isempty, regexp(C, 'auto')));

それでおしまい!

編集#1:単語自体だけでなく、単語「auto」を含む行を削除するように回答を変更しました。
編集#2:正規表現を受け入れるように回答を変更しました。

于 2013-01-04T15:21:17.850 に答える
1

を設定するtxt(i) = []と、配列の長さが変更されますが、ループのインデックス作成では変更が考慮されません。論理インデックスを使用して、ループと問題を回避できます。

例:

wordToDelete = 'auto';
txt = {'foo', 'bar', 'auto', 'auto', 'baz', 'auto'}
match = strcmp(wordToDelete, txt)
txt = txt(~match)

出力:

txt = 
    'foo'    'bar'    'auto'    'auto'    'baz'    'auto'
match =
     0     0     1     1     0     1
txt = 
    'foo'    'bar'    'baz'
于 2013-01-04T15:21:26.633 に答える