Frage

Ich habe einen Vektor, der die Werte 0, 1, 2 und 3 enthält. Kennt jemand einen einfachen Weg, dies zu tun?

Follow-up: Was ist, wenn die Anzahl der Elemente im Vektor kein ganzzahliges Multiple von 16 ist?

War es hilfreich?

Lösung

Hier ist eine vektorisierte Version:

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

Andere Tipps

Zu verfeinern, was von Jacob in seinem vorgeschlagen wurde Antworten und MTRW in seinem Kommentar, hier ist die prägnanteste Version, die ich mir einfallen lassen kann (angesichts einer 1-mal-N-Variablen vec enthält die Werte 0 bis 3):

value = uint32(vec(1:16)*4.^(0:15)');

Dies behandelt das erste Element im Array das am wenigsten signifikante Bit im Ergebnis. Verwenden Sie Folgendes, um das erste Element als das signifikanteste Bit zu behandeln:

value = uint32(vec(16:-1:1)*4.^(0:15)');

BEARBEITEN: Dies befasst sich mit der neuen Überarbeitung der Frage ...

Wenn die Anzahl der Elemente in Ihrem Vektor kein Vielfaches von 16 ist, hat die letzte Reihe von Zahlen, die Sie daraus extrahieren, weniger als 16 Werte. Sie möchten wahrscheinlich die höheren Teile der Serie mit Nullen padeln, um sie zu einem 16-Element-Vektor zu machen. Abhängig davon, ob das erste Element in der Serie das am wenigsten signifikante Bit (LSB) oder das meist signifikantes Bit (MSB) ist, werden Sie die Serie unterschiedlich auffüllen:

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

Wenn Sie den gesamten Vektor auf einmal verarbeiten möchten, würden Sie dies (mit einem notwendigen Null-Padding) für den Fall tun, wann vec(1) ist der 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)');

und wann vec(1) ist der 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)');

Ich denke, Sie sollten sich ansehen Bitget und Bitschicht. Es sollte möglich sein, so etwas zu sein (Pseudo-Matlab-Code, da ich schon lange nicht mehr mit Matlab gearbeitet habe):

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

Beachten Sie, dass Ihnen dies die letzten Teile des ersten Vektors in den höchsten Teilen erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top