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는 다음과 같이 생각해 낼 수있는 가장 간결한 버전입니다 (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 요소 벡터로 만들기 위해 시리즈의 더 높은 비트를 0으로 만들고 싶을 것입니다. 시리즈의 첫 번째 요소가 가장 중요하지 않은 비트 (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