MATLAB将值向量转换为UINT32
-
13-09-2019 - |
题
我有一个包含值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 ]))
其他提示
完善雅各布在他的建议 回答 和MTRW在他的评论中,这是我可以提出的最简洁的版本 vec
包含值0至3):
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)');
不隶属于 StackOverflow