Matlab - 将字符向量转换为数字向量?

问题描述 投票:0回答:4

我正在尝试实现数字输入示波器并通过串行端口发送它进行调试。我让示波器软件向 Matlab 发送一个类似“000000111111111000000001111111000000”的字符串。我想绘制这个。有什么方法可以让我把这个字符串分割成一个向量吗? Matlab 似乎不允许您使用不带分隔符的 strsplit() 。我不想在每个字节之间使用分隔符来使通信陷入困境。

matlab serial-port
4个回答
7
投票

借助 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'
的序数值,留下数值
0
1


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

1
投票

快速快速的解决方案是:

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

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

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

0
投票

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

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

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

我希望这可以帮助那些假设有一个像我假设的直接函数的人。如果有人知道一种方法可以在不转换我的“01...01....01....01....00....00....00....00”流的情况下执行此操作将字节转换为二进制数的 ascii 表示形式:“49.....49.....49....49....48....48....48....48 “,我很想听听。

© www.soinside.com 2019 - 2024. All rights reserved.