【发布时间】:2017-01-19 16:35:10
【问题描述】:
我有一组来自传感器的 32 位二进制值。我必须形成这些值的所有可能组合,然后将它们转换为十进制值。
如果传入的行数超过 80000 - 90000,代码会非常慢。运行需要 120 分钟。
我想优化这段代码,因为 3 个 For 循环和最内层循环中的一个函数会降低我的算法速度。有没有机会我可以消除一些 For 循环并用矢量化代替它们以加快处理速度。
b1 = [0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1];
b2 = [0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1];
b3 = [0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1];
b4 = [0 1 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1];
b5 = [0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1];
FullVector = [b1;b2;b3;b4;b5];
for Idx = 1:size(FullVector,1)
k = 1;
MinLength = 4;
MaxLength = 8;
StepSize = 2;
for StartByte = 1:8
for StartBit = 1:8
for SignalLength = MinLength:StepSize:MaxLength
DecimalVals.s(Idx,k) = BitCombinations(FullVector,StartByte,StartBit,SignalLength);
k = k+1;
end
end
end
end
功能:
function decimal = BitCombinations(ByteArray,Sbyte,Sbit,lengthSignal)
%function extracts the required bits from a byte array and
%returns the decimal equivalent of the bits.
%Inputs:
%Sbyte - Starting byte
%Sbit - Starting bit in the given byte
%length - length of bits to be extracted
%Output:
%dec - Returns the dec
startbit_pos = ((Sbyte-1)*8+Sbit);
endbit_pos = ((Sbyte-1)*8+Sbit+lengthSignal-1);
if endbit_pos <= 64
extractedbits = ByteArray(startbit_pos:endbit_pos);
extractedbits = fliplr(extractedbits);
decimal = bi2de(extractedbits);
else
decimal = NaN;
end
end
【问题讨论】:
-
我认为您的示例代码不完整/工作正常。例如,
Idx不会递增。有效符号可以跨字节数组吗? (您的代码似乎允许这样做) -
@mhopeng 很抱歉,但我认为我没有关注。我已经初始化了
Idx,一切似乎都在工作。 -
你可以在开始循环之前初始化你的 DecimalVals.s(Idx,k)
-
我会推荐和@Dammi一样的。在这种情况下,您还可以查看是否是您机器上的内存问题。
-
首先,不应该是
... = BitCombinations(FullVector(k, :), ...吗?其次,b的长度为 32 位,同时您检查endbit_pos是否为<64。在那种情况下不应该是<32吗?
标签: matlab for-loop optimization