首页 文章

MATLAB与GNU Octave Texts可能存在差异

提问于
浏览
0

我希望从.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 的功能只是做一个"search",以便能够创建临时的.dat文件 . 然后将此数据存储在 urldata 中,这是一个长字符数组 . 当我在MATLAB中使用 textscan 时,我根据需要得到12列,它们存储在单元格数组 data_received 中 .

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

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

任何帮助将非常感激 .

1 回答

  • 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 以查看它如何影响结果 .

相关问题