【问题标题】:MATLAB vs. GNU Octave Textscan disparityMATLAB 与 GNU Octave Textscan 差异
【发布时间】:2025-11-09 00:00:01
【问题描述】:

我希望在不先保存文件的情况下从 .dat 文件中读取一些数据。为此,我的代码如下所示:

urlsearch= 'http://minorplanetcenter.net/db_search/show_object?utf8=&object_id=2005+PM';
url= 'http://minorplanetcenter.net/tmp/2005_PM.dat';

urlmidstep=urlread(urlsearch);
urldata=urlread(url);

received= textscan(urldata , '%5s %7s %1s %1s %1s %17s %12s %12s %9s %6s %6s %3s ' ,'delimiter', '', 'whitespace', '');
data_received = received{:}

urlmidstep 的功能只是进行“搜索”,以便能够创建临时 .dat 文件。然后将此数据存储在urldata 中,这是一个长字符数组。然后,当我在 MATLAB 中使用 textscan 时,我会根据需要得到 12 列,它们存储在单元格数组 data_received 中。

但是,在 Octave 中,我收到各种警告消息:warning: strread: field width '%5s' (fmt spec # 1) extends beyond actual word limit(针对各种字段宽度)。我的问题是,为什么我在 Octave 中的结果不同,我该如何解决这个问题? Octave 的行为不应该与 MATLAB 相同,因为理论上任何差异都应该作为错误处理?

确定指定字符串的宽度并将分隔符和空格输入参数都留空应该告诉函数只处理字符串的宽度,允许空格是有效字符。

任何帮助将不胜感激。

【问题讨论】:

    标签: string matlab octave delimiter textscan


    【解决方案1】:

    我认为textscan 在 MATLAB 和 Octave 中的工作方式不同。为了说明,让我们简化示例。代码:

    test_line = 'K05P00M  C2003 01 28.38344309 37 57.87 +11 05 14.9                n~1HzV645';
    test = textscan(test_line,'%5s','delimiter','');
    test{:}
    

    将在 MATLAB 中产生以下结果:

    >> test{:}
    
    ans = 
    
        'K05P0'
        '0M  C'
        '2003 '
        '01 28'
        '.3834'
        '4309 '
        '37 57'
        '.87 +'
        '11 05'
        '14.9 '
        'n~1Hz'
        'V645'
    

    而在 Octave 中,您会得到:

    >> test{:}
    ans =
    {
      [1,1] = K05P0
      [2,1] = C2003
      [3,1] = 01
      [4,1] = 28.38
      [5,1] = 37
      [6,1] = 57.87
      [7,1] = +11
      [8,1] = 05
      [9,1] = 14.9
      [10,1] = n~1Hz
    }
    

    所以看起来 Octave 跳转到下一个单词并丢弃当前单词中的任何剩余字符,而 MATLAB 将整个字符串视为一个连续单词。

    为什么会这样,哪个是正确的,我不知道,但希望它能为您指明正确的方向,以了解正在发生的事情。您可以尝试添加delimiter 以查看它对结果的影响。

    【讨论】: