3

我有一個包含值0,1,2和3的向量。我想要做的是從該向量中繪製的每組16個元素中取低兩位並將它們附加所有在一起得到一個uint32。任何人都知道簡單的方法來做到這一點?MATLAB將值的向量轉換爲uint32

後續操作:如果矢量中元素的數量不是16的整數倍,該怎麼辦?

+0

只是好奇,但這是一個隱寫術項目? – Jacob 2009-07-15 15:55:07

+0

沒有。數字通信。我正在使用調製函數以及qammod對象。我有一堆uint32,我想用qpsk(或任何M-QAM)進行調製。除非你瞭解調製方案,否則有點難以解釋。 – devin 2009-07-18 04:39:26

+0

如果nWord不是一個整數,我猜它意味着在v的末尾有一個部分32位的字?我想你可以使用nWord = floor(size(v,1)/ 16),從v中提取前16個nWord值,然後排隊等待下一批輸入處理。 – mtrw 2009-07-20 01:55:47

回答

6

這裏有一個量化的版本降臨我:

v = floor(rand(64,1)*4); 
nWord = size(v,1)/16; 
sum(reshape([bitget(v,2) bitget(v,1)]',[32 nWord]).*repmat(2.^(31:(-1):0)',[1 nWord ])) 
0

我想你應該看看bitgetbitshift。它應該有可能是這樣的(僞MATLAB代碼,因爲我沒有用Matlab工作了很長一段時間):

result = 0; 
for i = 1:16 do 
    result += bitshift(bitget(vector(i), 2:-1:1), 2); 

注意,這會給你的第一個向量的最後一個位在最高位,所以你可能需要從16到1,而不是

3

要細化什麼是由雅各布在他answer和mtrw在他的評論所說,這裏是最簡潔的版本我可以想出(給出一個1的N變種通過3包含值0 iable vec):

value = uint32(vec(1:16)*4.^(0:15)'); 

這會將第一個元件的陣列在結果中的最低位顯著英寸爲了治療的第一個元素作爲最顯著位,使用以下命令:

value = uint32(vec(16:-1:1)*4.^(0:15)'); 

編輯:這解決問題的全新改版......

如果您的向量元素的數量不是16的倍數,那麼從中提取的最後一系列數字將少於16個值。你可能想要用零填充該系列的較高位,使其成爲一個16元素的向量。根據該系列中的第一個元素是最不顯著位(LSB)或最顯著位(MSB),你最終會不同填充系列:

v = [2 3 1 1 3 1 2 2]; % A sample 8-element vector 
v = [v zeros(1,8)]; % If v(1) is the LSB, set the higher bits to zero 
% or... 
v = [zeros(1,8) v]; % If v(1) is the MSB, again set the higher bits to zero 

如果要處理整個矢量一下子,這裏是你會怎麼做(與包括任何必要的補零)的情況下,當vec(1)是LSB:

nValues = numel(vec); 
nRem = rem(nValues,16); 
vec = [vec(:) zeros(1,nRem)]; % Pad with zeroes 
vec = reshape(vec,16,[])'; % Reshape to an N-by-16 matrix 
values = uint32(vec*4.^(0:15)'); 

vec(1)是MSB:

nValues = numel(vec); 
nRem = rem(nValues,16); 
vec = [vec(1:(nValues-nRem)) zeros(1,nRem) ... 
     vec((nValues-nRem+1):nValues)]; % Pad with zeroes 
vec = reshape(vec,16,[])'; % Reshape to an N-by-16 matrix 
values = uint32(fliplr(vec)*4.^(0:15)'); 
相關問題