我有一个包含值 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 在他的评论中提出的建议,这是我能想到的最简洁的版本(给定一个vec
包含值 0 到 3 的 1×N 变量):
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)');