【问题标题】:Matlab - Convert Character Vector Into Number Vector?Matlab - 将字符向量转换为数字向量?
【发布时间】:2023-04-01 13:27:01
【问题描述】:

我正在尝试为数字输入实现示波器并通过串行端口将其发送以进行调试。我有示波器软件向 Matlab 发送一个字符串,如“000000111111111000000001111111000000”。我想绘制这个。我有什么办法可以将此字符串拆分为向量。似乎 Matlab 不允许您在没有分隔符的情况下使用 strsplit()。我宁愿不要用每个字节之间的分隔符来阻碍通信。

【问题讨论】:

  • “将这个字符串分割成一个向量”——你到底是什么意思?请编辑您的问题以显示您的示例所需的输出是什么样的。

标签: regex matlab serial-port


【解决方案1】:

使用 MATLAB 的弱类型,这实际上很容易:

>> str = '000000111111111000000001111111000000'
str = 000000111111111000000001111111000000
>> class(str)
ans = char

>> vec = str - '0'
vec =

 Columns 1 through 22:

   0   0   0   0   0   0   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0

 Columns 23 through 36:

   0   1   1   1   1   1   1   1   0   0   0   0   0   0
>> class(vec)
ans = double

这会从字符串中的每个字符中减去字符 '0' 的序数值,留下数值 01

【讨论】:

  • 天哪,我从没想过这是一个合乎逻辑的解决方案。我可能还有大约 100 行其他代码,我现在可以在没有 str2num() 的情况下重做。谢谢!
【解决方案2】:

您可以将sscanf 与单个值宽度一起使用:

a = '000000111111111000000001111111000000'
b = sscanf(a, '%1d');

返回:

>> b.'

ans =

  Columns 1 through 18

     0     0     0     0     0     0     1     1     1     1     1     1     1     1     1     0     0     0

  Columns 19 through 36

     0     0     0     0     0     1     1     1     1     1     1     1     0     0     0     0     0     0

【讨论】:

    【解决方案3】:

    快速快速的解决方案是:

    data = '000001111111110000000000111111111110000000';
    vec = str2double(cellstr(data.').');
    

    它将产生一个数值列向量。如果你想要一个行向量作为输出,只需使用一个转置:

    vec = str2double(cellstr(data.'));
    

    【讨论】:

      【解决方案4】:

      我很惊讶这有多么困难。但这是我想出的:

      str = '000001111111110000000000111111111110000000'; %test string
      y = cellfun(@(x) str2num(x), regexp(str,'\d','match'));
      plot(y);
      

      regexp() 似乎是唯一的方法。默认情况下,它返回匹配索引,因此您需要指定“匹配”。然后你最终得到一个字符串单元数组。将其转换为数值数组的唯一好方法是使用 str2num() 一次一项。

      我希望这可以帮助那些假设有我假设的直接功能的其他人。如果有人知道在不转换我的“01...01....01....01....00....00....00....00”流的情况下做到这一点的方法字节转换为二进制数的 ascii 表示:“49.....49.....49....49....48....48....48....48 ",我很想听。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 2017-11-06
        相关资源
        最近更新 更多