MATLAB将一个值向量转换为uint32

3

我有一个向量,包含值0、1、2和3。我想做的是从这个向量中抽取每组16个元素中的低两位,并将它们全部连接在一起得到一个uint32。有人知道简单的方法吗?

跟进问题:如果向量中的元素数量不是16的整数倍怎么办?


只是好奇,这是一个隐写术项目吗? - Jacob
不行。数字通信。我正在使用调制函数和qammod对象。我有一堆uint32,想要使用qpsk(或任何M-QAM)进行调制。除非您了解调制方案,否则很难解释清楚。 - devin
如果nWord不是整数,我猜这意味着在v的末尾有一个部分32位字?我想你可以使用nWord = floor(size(v,1)/16),从v中提取前16*nWord个值,并将其余部分排队等待下一批输入进行处理。 - mtrw
3个回答

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 ]))

5
向量化非常聪明,我没有想到。您可以使用以下代码(轻微地)进行优化,它避免了使用bitget: sum(reshape(v, [16 nWord]) .* repmat(2.^(30:(-2):0)',[1 nWord])); - mtrw
1
好的,再来一个优化,使用矩阵乘法: uint32(reshape(v, [16 nWord])' * (2.^(30:(-2):0)'))' (我还添加了uint32的转换)。 正如schnaader在他/她的回答中所说,如果您的向量是LSB到MSB,则将指数向量更改为0:2:30。 - mtrw

3

在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)');

0

我认为你应该看一下bitgetbitshift。它应该可以像这样(伪Matlab代码,因为我很久没有用Matlab了):

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

请注意,这将使第一个向量的最后几位出现在最高位,因此您可能希望将 i 从 16 递减到 1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接