我有一个数组,它由大约3500万(M(行组成,每行包含一个32位二进制数。这部分代码的想法是取每个32位的行,并根据它们在二进制数字中的位置将其转换回3个单独的十进制数字。例如,前8位数字被转换为数字"yval",接下来的8位被转换为"xval",然后的12位被转换成"binval"。这目前处于For循环中,大约运行3500万次,每行一次。然后,它将十进制数字输出到"lidarcube"中。基本上,我想知道是否有更快的方法可以做到这一点?目前大约需要一个小时来处理,我希望能减少这一点。如果对此解释不周,我深表歉意,我对Matlab和一般编码都是新手。
for count = 1:M
yval = 1+bi2de(no_frame(count,1:8));
xval = 1+bi2de(no_frame(count,9:16));
binval = 1+bi2de(no_frame(count,17:28));
lidarcube(xval,yval,binval) = lidarcube(xval,yval,binval)+1;
end
save('test.mat','lidarcube')
对于8位二进制数组,可以通过乘以2的相应幂并求和来计算小数等价值。这可以很容易地实现为矢量化操作。
% generate some sample data
rng(0);
no_frame = randi([0,1],3,32); % 3 rows, 32 cols, all zero or one
% Define custom binary 2 decimal conversion function
fb2d = @(x) sum( x .* (2.^((size(x,2)-1):-1:0)), 2 );
% Calculate the decimal values in column blocks of 8
yval = fb2d( no_frame(:,1:8) );
xval = fb2d( no_frame(:,9:16) );
binval = fb2d( no_frame(:,17:28) );
只要预先分配了lidarcube
,剩余的循环可能不会太慢。
for count = 1:M
i_yval = 1 + yval(count);
i_xval = 1 + xval(count);
i_binval = 1 + binval(count);
lidarcube(i_xval,i_yval,i_binval) = lidarcube(i_xval,i_yval,i_binval) + 1;
end