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)'); 
相关问题