Примечание: Этот ответ в основном относится к неподписанным типам данных. Для преобразования в подписанные типы необходимы несколько дополнительных шагов, обсуждаемых здесь .
Функция bin2dec
является одной из опций, но требует, чтобы вы сначала изменили вектор на строку. bin2dec
также может быть медленным по сравнению с вычислением числа самостоятельно. Вот решение, которое примерно в 75 раз быстрее:
>> A = [0,1,1,0,0,0,0,0,1,1,0,0];
>> B = sum(A.*2.^(numel(A)-1:-1:0))
B =
1548
Для пояснения, A
умножается поэлементно на вектор степеней 2 с показателями в диапазоне от numel(A)-1
до 0
. Результирующий вектор затем суммируется, чтобы получить целое число, представленное двоичным шаблоном нулей и единиц, причем первый элемент в массиве считается самым старшим битом. Если вы хотите, чтобы первый элемент считался младшим значащим битом, вы можете сделать следующее:
>> B = sum(A.*2.^(0:numel(A)-1))
B =
774
Обновление: Возможно, вы сможете выжать из MATLAB еще немного быстрее, используя find
, чтобы получить их индексы (избегая поэлементного умножения и, возможно, сокращение количества необходимых расчетов показателей) и использование функции pow2
вместо 2.^...
:
B = sum(pow2(find(flip(A))-1)); % Most significant bit first
B = sum(pow2(find(A)-1)); % Least significant bit first
Расширение решения на матрицы ...
Если у вас много двоичных векторов, которые вы хотите преобразовать в целые числа, приведенное выше решение можно легко изменить, чтобы преобразовать все значения с помощью одной матричной операции. Предположим, что A
является матрицей N-12, с одним двоичным вектором на строку. Следующее преобразует их все в вектор целочисленных значений N-на-1:
B = A*(2.^(size(A, 2)-1:-1:0)).'; % Most significant bit first
B = A*(2.^(0:size(A, 2)-1)).'; % Least significant bit first
Также обратите внимание, что все вышеперечисленные решения автоматически определяют количество бит в вашем векторе, просматривая количество столбцов в A
.