値のベクトルをuint32に変換するmatlab
-
13-09-2019 - |
質問
値0、1、2、および3を含むベクトルがあります。私がやりたいのは、このベクトルから描かれた16の要素の各セットから2ビットを2ビットして、それらをすべて追加して1つの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の彼のコメントで、ここに私が思いつくことができる最も簡潔なバージョンがあります(1 x-n変数が与えられます 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