Создать матрицу со случайным двоичным элементом в matlab

Я хочу создать матрицу в matlab с 500 ячейками (50 строк, 10 столбцов), как я могу создать и инициализировать его случайными двоичными цифрами?  Я хочу что-то подобное в шкале 50 * 10 в качестве образца 3 * 4

0 1 1 1
0 0 0 0
1 1 1 1

и после него, как можно получить десятичное уравнение любой строки? как строка 1 равна 7 в десятичной форме

Ответ 1

Почему бы не использовать randi для генерации случайных целых чисел?

A = randi([0 1], 50, 10);

и преобразовать двоичную строку в число - как в предыдущих ответах:

bin2dec(num2str(A(n,:)))

Ответ 2

Попробуйте следующее:

A = rand(50, 10) > 0.5;

Десятичный эквивалент строки n th определяется следующим образом:

 bin2dec(num2str(A(n,:)))

или, если хотите,

sum( A(n,:) .* 2.^(size(A,2)-1:-1:0) )   % for big endian
sum( A(n,:) .* 2.^(0:size(A,2)-1) )      % for little endian

что в несколько раз быстрее, чем bin2dec.

Ответ 3

Другая опция:

 A=round(rand(50,10));

Десятичный eq n-й строки определяется следующим образом:

 bin2dec(num2str(A(n,:)))

Ответ 4

С помощью других яснее я нахожу это довольно непривлекательным, генерируя случайные числа с 32 или 64-битными номерами, а затем отбрасывая 31 или 63 из них... и, скорее, с чем-то вроде:

A_dec=randi([0,2^10-1],50,1,'uint16');

И чтобы получить бит:

A_bin=bsxfun(@(a,i)logical(bitget(a,i)),A_dec,10:-1:1);

Это также в несколько раз быстрее для больших массивов (R2014a, i7 930) [но это не кажется важным для OP]:

крестики; для я = 1:1000; n = randi ([0,2 ^ 10-1], 50000,1, 'uint16'); конец; TOC

Elapsed time is 1.341566 seconds.

крестики; для я = 1:1000; n = bsxfun (@(n, i) логический (битгет (n, i)), randi ([0,2 ^ 10-1], 50000,1, 'uint16'), 10: -1:1); конец; TOC

Elapsed time is 2.547187 seconds. 

крестики; для я = 1:1000; n = rand (50000,10) > 0,5; end; toc

Elapsed time is 8.030767 seconds.

крестики; для я = 1:1000; n = сумма (bsxfun (@times, rand (50000,10) > 0,5,2. ^ (0: 9)), 2); конец; TOC

Elapsed time is 13.062462 seconds.

binornd еще медленнее:

крестики; для я = 1:1000; n = логический (бинннд (единицы (50000,10), 0,5)); конец; TOC

Elapsed time is 47.657960 seconds.

Обратите внимание, что это все еще не оптимально из-за того, как MATLAB сохраняет логические. (биты, сохраненные как байты...)

Ответ 5

Или вы можете попробовать это следующим образом:

A = binornd(ones(50,10),p);

Таким образом, вы также можете управлять вероятностью их появления.