我正在尝试加快一点转换过程,这是目前在MATLAB循环中并且需要很长时间才能执行。这是问题所在:
考虑一个大小为input
的{{1}}整数矩阵,其中12xN
可以很容易地N
左右。然后我执行以下操作:
100,000
我基本上将每列转换为3个浮点数,但我想看看是否有任何方法可以加快这个过程,并删除你在这里看到的循环。
有这样的方式吗?谢谢!
修改
以下示例说明了我的目标:假设我们的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
是inputMatrix
,由以下内容组成:
12 x 4
转换后的输出(参见here转换/通过IEEE-754标准解压缩到浮点数)将是 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
值:
output
因此, 20.5635 21.1135 87.5046 21.8584
6.5479 7.5226 46.9522 8.7748
-0.3616 -0.3558 3.9000 -0.3607
的第一个12元素列将给出inputMatrix
的第一个3元素列。 (换句话说,[16,164,30,16]将给出20.5635,而[16,64,209,136]将给出6.5479等)。
我想做的是,它尽可能地在此矩阵上对此操作进行矢量化。谢谢!
答案 0 :(得分:1)
typecast
是矢量化的,因此您可以将整个输入数组提供给它。 (请注意,input
是内置函数的名称,因此您应该将变量命名为其他内容。)结果是列向量,因此您需要在之后对其进行重新整形。
我不得不翻转输入数组中的字节顺序,所以我只对整个数组做了flipud
。这会导致生成的浮动顺序错误,所以我只是对结果重复了flipud
。
>> 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
更新:我之前的版本(在Octave上运行)只是对完整矩阵A
进行了类型转换。 MATLAB显然更挑剔并且想要一个向量,因此更新使用A(:)
将矩阵转换为列向量。其他一切都是一样的。