2014-02-20 40 views
0

我有5千字節的十六進制數據每秒從一個串口進來。數據是每個讀數16位(2字節)。我需要6個讀數,然後是停止/開始位。原始數據看起來是這樣的:Matlab:需要壓縮一個字符串向量

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,我知道有在尺寸不匹配。那是我想要去做。

問題

從本質上講,之後我減少一個字符串轉換爲載體的,每個字符讓說,我怎麼做一個新的載體,其是盧克(J)=維達(我的濃度:我+3)?

謝謝你的任何和所有的幫助,我很感激。

編輯

我試圖從用戶的算法如下:禁衛軍和它不會工作。 reshape()在這裏不是正確的,因爲我得到的字符串是我從串口獲得的26位可變數字。在這裏看到示例:

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

這些彈出不時,因爲這是真實的世界和錯誤比比皆是。

雖然我不是要求錯誤檢查,但我仍然在問如何取一個字符串,將其解析爲4個左右的組,然後將這些塊放入一個向量中。

再次感謝您的任何和所有幫助

+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 
+0

該死的時間限制...... 工作我的意思是說,上面的解決方案不適合我,因爲reshape()算法僅用於向量。我首先必須矢量化我的字符串,MatLab不會這樣做。此外,該字符串是200,000個字符長。 再一次,謝謝 – user3320919

+0

大小(in,2)/ 6 部分是不可變的,而且由於我的字符串的長度會很大,所以我不能使用reshape()算法。還是謝謝你。 – user3320919

+0

好的,我想了一下更多: 假設我想將'in'延伸到4個副本,5個副本等,我該怎麼做呢? – user3320919