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

AK4749 的答案在显示你出错的地方是绝对正确的。我将为您的解决方案添加一个更短的替代解决方案:

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

而已!

编辑#1:修改答案以删除包含单词“auto”的行,而不仅仅是单词本身。
编辑#2:修改答案以接受正则表达式。

于 2013-01-04T15:21:17.850 回答
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 回答
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 回答