【问题标题】:Comparing strings read in line by line from a file in Matlab比较从Matlab中的文件逐行读取的字符串
【发布时间】:2016-05-24 02:47:42
【问题描述】:

我有一个非常基本的问题。我正在阅读 Matlab 中的文件,我想检测一行何时显示“occurence1”。但我收到“the”矩阵尺寸错误。我猜matlab在某些行中读取为数字矩阵左右?

我的数据如下所示:

String2
occurence1
3.2 1.2
string3
occurence1

我应该将 tline 转换为字符串还是什么?我精通Java,但我在matlab的非定义变量方面遇到了一些麻烦......

%open file with patterns
fid = fopen('filename.txt');

tline = fgetl(fid);

disp(tline);
while ischar(tline)
    disp(tline)
    tline = fgetl(fid);


    if (num2str(tline)=='occurence1')

        disp(tline)
    end


end

fclose(fid);

【问题讨论】:

  • fgetl 的返回已经是一个文本字符串,所以num2str 调用是无意义的。另外,使用字符串函数,如strcmp,来比较字符串。
  • 此外,一般来说,提供实际错误消息和堆栈跟踪比说“我收到错误”要有用得多
  • 另外,您当前的实现永远不会检查文件的第一行。
  • 谢谢,strcmp 就是我要找的东西!
  • 您想发布 strcmp 作为您的答案吗?我会接受的。

标签: matlab


【解决方案1】:

正如编辑器中的 M-Lint 消息所解释的:

代码使用等于 (==) 比较两个字符串 等于 (~=) 关系运算符。 MATLAB 软件在 如果要比较的字符串长度不同,则运行时间。即使 MATLAB在代码运行时没有返回错误,很可能是 这段代码效率低。

MATLAB 的 == 返回一个逻辑数组,其中 AB 相等。根据文档,== 的输入必须具有相同的大小,除非一个是标量(然后扩展为与另一个数组相同的大小)。因为你的行长度不同,当遇到字符长度与'occurence1' 不同的行时,相等性检查将失败。因为您的算法跳过了第一行(您在比较循环之外调用fgetl)并且您的第二行是'occurence1',所以在您到达第三行之前您不会看到错误。

不要使用==,而是使用MATLAB 的内置字符串比较函数之一,如strcmpstrcmpi 来执行逻辑检查。


此外,虽然 MATLAB 不是静态类型的,但内置函数的输出通常都有很好的文档记录。在这种情况下,fgetl 的文档解释说,输出是一个字符串,除非该行仅包含文件结束标记。所以这里不需要num2str 调用。

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多