我正在尝试为数字输入实现示波器,并通过串行端口进行调试。我有范围软件发送Matlab字符串像" 000000111111111000000001111111000000"。我想画这个。有没有办法让我把这个字符串拆分成一个向量。看起来Matlab不允许你使用没有分隔符的strsplit()。我宁愿不用每个字节之间的分隔符来阻塞通信。
答案 0 :(得分: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
。
答案 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
答案 2 :(得分:1)
快速而快速的解决方案是:
data = '000001111111110000000000111111111110000000';
vec = str2double(cellstr(data.').');
它将生成数值的列向量。如果你想要一个行向量作为输出,只需使用一个转置:
vec = str2double(cellstr(data.'));
答案 3 :(得分:0)
我很惊讶这是多么困难。但这就是我想出的:
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",我很乐意听到它。