0

Ich versuche, einen Bitkonvertierungsprozess zu beschleunigen, der momentan in einer MATLAB-Schleife ist und sehr viel Zeit für die Ausführung benötigt. Hier ist das Problem:Ist dieser Bitkonvertierungsprozess vektorisierbar? (MATLAB)

Betrachten Sie eine input integer Matrix der Größe 12xN, wo N leicht 100,000 sein kann, oder so. Dann führe ich die folgenden Operationen:

output = zeros(3, N); 
temp = zeros(3,1); 

% Loop through each column 
for pp = 1 : N    

    % For each column, convert the first 4 numbers into a float, the second 4 numbers into a float, and finally the third 4 numbers into a float as so: 
    for dd = 1:3 
     snip = input(dd * 4 : -1 : (dd-1) * 4 + 1, pp); 
     temp(dd) = typecast(uint32(bin2dec(num2str(reshape(dec2bin(snip,8).',1, 32)))), 'single');   
    end 

    % Now simply store the result 
    output(1:3,pp) = temp; 
end 

Ich Umwandlung grundsätzlich jede Spalte in 3 Gleitkommazahlen, aber ich möchte, um zu sehen, ob es eine Möglichkeit ist, in der ich diesen Prozess beschleunigen kann, und entfernen die Schleife (s) siehst du hier.

Gibt es so einen Weg? Vielen Dank!

EDIT:

Hier ist ein Beispiel, mein Ziel zu veranschaulichen: unsere Angenommen inputMatrix ist ein 12 x 4, bestehend aus:

65 65 66 65 
    164 168 175 174 
    130 232 2 222 
    16 138 86 27 
    64 64 66 65 
    209 240 59 12 
    136 185 207 101 
    103 33 18 172 
    190 190 64 190 
    185 182 121 184 
    36 41 153 173 
    19 55 127 183 

Der Ausgang nach meinem Conversions (siehe here zur Umwandlung/Entpacken zu Fließkomma über IEEE-754-Standard), wird ein output von Werten sein:

20.5635 21.1135 87.5046 21.8584 
    6.5479 7.5226 46.9522 8.7748 
    -0.3616 -0.3558 3.9000 -0.3607 

Somit ergibt die erste 12-Element-Säule von inputMatrix die erste 3-Element-Säule von output. (Mit anderen Worten, [16, 164, 30, 16] ergibt 20.5635, und [16, 64, 209, 136] ergibt 6.5479 usw.).

Was ich tun möchte, vektorisieren diese Operation auf dieser Matrix so viel wie möglich. Vielen Dank!

Antwort

1

typecast ist vektorisiert, so dass Sie nur das gesamte Eingabearray dazu füttern können. (Beachten Sie, dass input der Name einer integrierten Funktion ist, also sollten Sie Ihre Variable wirklich etwas anderes nennen.) Das Ergebnis ist ein Spaltenvektor, also müssen Sie ihn später umformen.

Ich musste die Byte-Reihenfolge in der Eingabe-Array umkehren, also habe ich gerade flipud auf das gesamte Array. Dies brachte die resultierenden Floats in die falsche Reihenfolge, so dass ich einfach flipud über das Ergebnis wiederholte.

>> A = [ 65 65 66 65 
      164 168 175 174 
      130 232 2 222 
      16 138 86 27 
      64 64 66 65 
      209 240 59 12 
      136 185 207 101 
      103 33 18 172 
      190 190 64 190 
      185 182 121 184 
      36 41 153 173 
      19 55 127 183];  

>> Af=flipud(uint8(A)); 

>> B = flipud(reshape(typecast(Af(:), 'single'), 3, [])) 
B = 

    20.56351 21.11354 87.50456 21.85845 
    6.54790 7.52260 46.95222 8.77482 
    -0.36160 -0.35578 3.89999 -0.36070 

Update: Meine frühere Version (die auf Oktavläufe) typisieren nur die vollständige Matrix A. MATLAB ist anscheinend wählerischer und möchte einen Vektor, daher konvertiert das Update die Matrix in einen Spaltenvektor unter Verwendung von A(:). Alles andere ist gleich.

+0

Hallo Becher, aus irgendeinem Grund die Typumwandlung ich habe beschwert, dass "das erste Argument muss ein Vektor sein" ... – TheGrapeBeyond

+0

Wir bekommen das gleiche Verhalten auf MATLAB (ich hatte auf Octave getestet). Ich werde die Antwort aktualisieren. – beaker

+0

Hallo Becher, ok, also der (:) Operator kümmerte sich darum, aber ich denke nicht, dass die Antwort (der tatsächlichen Konvertierung) das Gleiche zwischen meinem Code und Ihrem Code ist. Ich denke, dass die Subtilität in meinem Code es mir ermöglicht, eine Eingabespalte zu nehmen und 3 Floats auszugeben. Diese Konvertierung findet nicht in Ihrem Code statt ... danke. – TheGrapeBeyond