我有一个向量,包含值0、1、2和3。我想做的是从这个向量中抽取每组16个元素中的低两位,并将它们全部连接在一起得到一个uint32。有人知道简单的方法吗?
跟进问题:如果向量中的元素数量不是16的整数倍怎么办?
我有一个向量,包含值0、1、2和3。我想做的是从这个向量中抽取每组16个元素中的低两位,并将它们全部连接在一起得到一个uint32。有人知道简单的方法吗?
跟进问题:如果向量中的元素数量不是16的整数倍怎么办?
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 ]))
在Jacob的答案和mtrw的评论中提出的建议,这里是我能想到的最简洁的版本(假设有一个包含0到3值的1xN变量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)
是最低有效位的情况下,以下是如何执行此操作:
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)
是最高位时:
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)');