首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB与GNU Octave Textscan视差

MATLAB与GNU Octave Textscan视差
EN

Stack Overflow用户
提问于 2015-07-14 17:23:29
回答 1查看 682关注 0票数 1

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

代码语言:javascript
复制
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相同,因为在理论上,任何差异都应该作为bug来处理?

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

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2015-07-14 20:11:22

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

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

在MATLAB中,will将产生以下结果:

代码语言:javascript
复制
>> test{:}

ans = 

    'K05P0'
    '0M  C'
    '2003 '
    '01 28'
    '.3834'
    '4309 '
    '37 57'
    '.87 +'
    '11 05'
    '14.9 '
    'n~1Hz'
    'V645'

而在Octave中,你会得到:

代码语言:javascript
复制
>> 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,看看它对结果有何影响。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31402680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档