【问题标题】:Matlab strsplit at non-keyboard charactersMatlab strsplit 在非键盘字符
【发布时间】:2020-01-27 15:06:27
【问题描述】:

在这种情况下,我有一个纬度/经度坐标的元胞数组,我从文件中读取格式为字符串的格式:

x = {'27° 57'' 21.4" N', '7° 34'' 11.1" W'}

° 实际上是一个度数符号 (U+00B0)。

我想使用strsplit() 或类似的东西来取出数字分量,但我不知道如何将度数符号指定为分隔符。

我很犹豫是否简单地在 ',' 处拆分并索引该数字,因为如上所示,我不知道期望多少位数。

我在网站的其他地方发现了以下建议:

x = regexp(split{1}, '\D+', 'split')

不过,这也将十进制数的整数和小数部分分开。

是否有 strsplit() 选项,或者我可以使用的其他等效选项?

【问题讨论】:

  • 您可以将文件中的符号复制粘贴到您的脚本中。 MATLAB 完全支持 Unicode。
  • 这太简单了。谢谢你的帮助。如果您想将其作为答案提交,我可以将问题标记为已回答:)
  • 干杯路易斯,好球。我现在已经修改了。
  • @TheSuperLemming 谢谢!

标签: matlab symbols strsplit


【解决方案1】:

您可以将数据文件中的度数符号复制粘贴到 M 文件脚本中。 MATLAB 在其字符串中完全支持 Unicode 字符。例如:

strsplit(str, {'°','"',''''})

在三个符号处拆分字符串。

或者,您可以使用sscanf(或fscanf,如果直接从文件中读取)来解析字符串:

str = '27° 57'' 21.4"';
dot( sscanf(str, '%f° %f'' %f"'), [1, 1/60, 1/3600] );

【讨论】:

  • 次要技术问题:Matlab 不完全支持 Unicode 字符,仅支持基本多语言平面中可以用单个 UCS-2 代码点表示的字符。不支持像表情符号这样需要 UTF-16 代理对的字符。 (我并不是说这是迂腐;我实际上有时想使用表情符号并将其作为一个真实的用例。)
  • @AndrewJanke:我不知道,感谢您的澄清!
【解决方案2】:

最简单的解决方案是按照 Cris 的建议 by Cris 将任何 Unicode 字符复制粘贴到您的 MATLAB 编辑器中。

您可以从 Internet 或 Windows Character Map 轻松获得这些信息

如果您想对原生 Unicode 设置使用字节值,也可以使用 unicode2nativenative2unicode

% Get the Unicode value for '°'
>> unicode2native('°')
ans = uint8(176)

% Check the symbol for a given Unicode value
>> native2unicode(176)
ans = '°'

所以

>> strsplit( 'Water freezes at 0°C', native2unicode(176) )
ans =
  1×2 cell array
  {'Water freezes at 0'}    {'C'}

如果你想避免unicode2native,你可以通过在你已经知道的十六进制值上使用hex2dec来获取Unicode值:

hex2dec('00B0') % = 176

【讨论】:

  • 不错!我不知道那个。
  • Cheers Wolfie,支持添加“native2unicode”。我已将 Cris 的答案标记为官方答案,因为他是第一个回答原始问题的人,但如果可以的话,我也会标记它。
  • 使用说明:说hex2dec('00B0') 可能会产生误导:如果前两位数字不是零,则会给出错误的答案(因为native2unicode 的输入必须在0- 255;它们被视为字节)。 char(hex2dec('xxxx')) 将适用于更广泛的值,因为它执行 Unicode 代码点值转换而不是 UTF-8 编码转换。
【解决方案3】:

您还可以改进正则表达式以捕获小数部分:

x = {'27° 57'' 21.4" N', '7° 34'' 11.1" W'}
x = regexp(x, '\d+\.?\d?', 'match') 
x{:}

结果:

ans =
{
  [1,1] = 27
  [1,2] = 57
  [1,3] = 21.4
}

ans =
{
  [1,1] = 7
  [1,2] = 34
  [1,3] = 11.1
}

\d+\.?\d? 的意思是:

\d+  : one or more digit
%followed by
\.?  : zero or one point
%followed by
\d?  : zero or one digit

【讨论】:

    【解决方案4】:

    考虑对字符串使用 split 和 double:

    >> x = {'27° 57'' 21.4" N'; '7° 34'' 11.1" W'};    
    >> x = string(x)
    
    x = 
    
      2×1 string array
    
        "27° 57' 21.4" N"
        "7° 34' 11.1" W"
    
    >> x = split(x,["° " "' " '" '])
    
    x = 
    
      2×4 string array
    
        "27"    "57"    "21.4"    "N"
        "7"     "34"    "11.1"    "W"
    
    >> double(x(:,1:3))
    
    ans =
    
       27.0000   57.0000   21.4000
        7.0000   34.0000   11.1000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多