【问题标题】:Matlab: Need to compact a vector of stringsMatlab:需要压缩字符串向量
【发布时间】:2014-02-20 00:00:30
【问题描述】:

我每秒有 5 KB 的十六进制数据从串行端口传入。每次读取的数据为 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

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

不过,我希望 Luke 不仅仅是一组 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 个左右的组,然后将这些块放入一个向量中。

再次感谢您的帮助

【问题讨论】:

  • 你必须告诉 Luke 真相才能让你的代码正常工作:-)

标签: string matlab vector concatenation


【解决方案1】:

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

% 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

【讨论】:

  • 该死的编辑时间限制......我的意思是上述解决方案对我不起作用,因为 reshape() 算法只接受向量。我首先必须对我的字符串进行矢量化,而 MatLab 不会这样做。此外,该字符串的长度为 200,000 个字符。再次感谢您
  • size(in, 2)/6 部分是不可变的,并且由于我的字符串的长度会很大,所以我不能使用 reshape() 算法。还是谢谢你。
  • 好吧,我想通了一点:假设我想将 'in' 扩展到 4 个副本、5 个副本等,我该怎么做呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2011-08-18
  • 2015-12-14
  • 2019-10-04
相关资源
最近更新 更多