Функция 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
Update: Вы можете быть в состоянии сжать даже немного больше скорости из 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
.
Это похоже на функцию ** bin2dec **, за исключением использования ** pow2 **, в дополнение к удалению пробелов из строки и преобразованию ее в число с помощью 's-'0'' – Amro