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!
Hallo Becher, aus irgendeinem Grund die Typumwandlung ich habe beschwert, dass "das erste Argument muss ein Vektor sein" ... – TheGrapeBeyond
Wir bekommen das gleiche Verhalten auf MATLAB (ich hatte auf Octave getestet). Ich werde die Antwort aktualisieren. – beaker
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