我正在尝试实现数字输入示波器并通过串行端口发送它进行调试。我让示波器软件向 Matlab 发送一个类似“000000111111111000000001111111000000”的字符串。我想绘制这个。有什么方法可以让我把这个字符串分割成一个向量吗? Matlab 似乎不允许您使用不带分隔符的 strsplit() 。我不想在每个字节之间使用分隔符来使通信陷入困境。
借助 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
。
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
快速快速的解决方案是:
data = '000001111111110000000000111111111110000000';
vec = str2double(cellstr(data.').');
它将产生一个数值列向量。如果您想要行向量作为输出,只需使用单个转置:
vec = str2double(cellstr(data.'));
我很惊讶这是多么困难。但这是我想到的:
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 “,我很想听听。