这个位转换过程是否可以向量化? (MATLAB)

时间:2016-05-08 20:09:23

标签: performance matlab type-conversion bit-manipulation vectorization

我正在尝试加快一点转换过程,这是目前在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等)。

我想做的是,它尽可能地在此矩阵上对此操作进行矢量化。谢谢!

1 个答案:

答案 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(:)将矩阵转换为列向量。其他一切都是一样的。