문제

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

나는 당신이보아야한다고 생각합니다 BITGET 그리고 비트 시프트. Matlab과 오랫동안 작업하지 않았기 때문에 이와 같은 것이 될 수 있어야합니다 (Pseudo-Matlab 코드) :

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

이것은 당신에게 첫 번째 벡터의 마지막 비트를 가장 높은 비트로 제공 할 것이므로 대신 16에서 1까지 내려 가고 싶을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top