Matlab:需要压缩字符串向量

时间:2014-02-20 00:00:30

标签: string matlab vector concatenation

我每秒从串口输入5千字节的十六进制数据。每次读取数据为16位(2字节)。我需要6个读数,然后是停止/启动位。原始数据如下所示:

FF230008FF5800DD00F8000A41FF230008FF5800DE00FD000C41....

我会分手以便更好地理解:

FF23 0008 FF58 00DD 00F8 000A **41** FF23 0008 FF58 00DE 00FD 000C **41**....

空间介于我需要的数据之间。 **表示开始/停止位。

问题:

我有一段时间将字符串分成我可以使用和绘制的部分。我想将字符串压缩为大小为[6,长度(数据)]的矩阵。上一个字符串在我脑海中看起来像这样:

FF23 , 0008 , FF58 , 00DD , 00F8 , 000A 
FF23 , 0008 , FF58 , 00DE , 00FD , 000C
....

我的失败尝试

for i = 1:(length(Vader)-4)
    Luke= Vader(i:i+3);
    i = i+4;
end
Luke

它输出:

00A4

我正在查看的数据集的正确答案是什么。是的,我将不得不处理停止/启动位,这并不容易。

不过,我希望卢克不仅仅是一组4个字符。我需要的是至少一个向量,而不仅仅是一个字符串。我试过这个:

HanSolo = floor(length(Vader)/4);
for j = 1:HanSolo
    for i = 1:(length(Vader)-4)
        Luke(j) = Vader(i:i+3);
        i = i+4;
    end 
    j = j+1;
end
Luke

但我得到这个错误:

??? Subscripted assignment dimension mismatch.

Error in ==> hex_conversion at 19
    Luke(j) = Vader(i:i+3);

是的,MatLab,我知道尺寸不匹配。这就是我想要做的事情。

问题

基本上,在我将一个字符串缩减为一个向量之后,逐个字符让我们说,如何创建一个集中了Luke(j)= Vader(i:i + 3)的新向量?

感谢您提供任何帮助,我很感激。

修改

我尝试使用以下算法:Praetorian并且它不起作用。 reshape()在这里使用不正确,因为我输入的字符串是从串口进入的26位可变数字。请参见此处的示例:

30008FF5A00DB00F9000A41
for clarity:
3 0008 FF5A 00DB 00F9 000A **41**

这些不时出现,因为这是现实世界,错误比比皆是。

我不是要求错误检查,我仍然问如何取一个字符串,将其解析为4个左右的组,然后将这些块放入向量中。

再次感谢您提供的任何帮助

1 个答案:

答案 0 :(得分:0)

我认为这就是你要找的东西;不知道这是否是最快的解决方案...

% I duplicated the input you provided thrice
in = [...
'FF230008FF5800DD00F8000A41FF230008FF5800DE00FD000C41' ...
'FF230008FF5800DD00F8000A41FF230008FF5800DE00FD000C41' ...
'FF230008FF5800DD00F8000A41FF230008FF5800DE00FD000C41'];

% Reshape the vector of chars into 6 rows
in = reshape(in, size(in, 2)/6, 6)';

% Trim the trailing stop bits
in = in(:,1:end-2);

% Reshape it into a vector so we can get sscanf to read it
in = reshape(in', 1, prod(size(in)));

% Read 4 hex chars at a time and reshape the result into a matrix
out = reshape(sscanf(in, '%4x'), size(in, 2)/(4 * 6), 6)'

结果:

out =
   65315       8   65368     221     248      10
   65315       8   65368     222     253      12
   65315       8   65368     221     248      10
   65315       8   65368     222     253      12
   65315       8   65368     221     248      10
   65315       8   65368     222     253      12