在Matlab中创建随机二进制元素的矩阵

11
我想在Matlab中创建一个500个单元格的矩阵(50行,10列),如何用随机二进制数字创建和初始化它? 我想要一个类似于50 * 10规模的东西 例如3 * 4样本
``` 0 1 1 1 0 0 0 0 1 1 1 1 ```
并且之后,如何获取任何一行的十进制等式?例如第一行等于十进制数7。
5个回答

12

为什么不使用randi来生成随机整数?

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

将二进制行转换为数字 - 就像前面的答案一样:

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

1
因为整数是整数,布尔值是布尔值。即使在Matlab中,坚持使用正确的类型总是最好的选择 :) - Rody Oldenhuis
1
@RodyOldenhuis OP 想要二进制数字,而不是“真”和“假”。这意味着数字,而不是逻辑值。 - angainor
点击这里查看“二进制位”的定义 :) truefalse只是分别表示10的不同词。 - Rody Oldenhuis
是的,由于rand[0,1)中均匀选择,所以命令rand>0.5返回truefalse的概率相等。请注意,在C/C++中,您可以生成随机的双精度数像这里,而随机整数则可以通过这里来实现。还请注意最后一个链接中靠近顶部几行下面的备注。我们无法确定Mathworks是否使用了C或Fortran来实现randrandi,但根据这两个链接,rand似乎更为可靠。 - Rody Oldenhuis
@RodyOldenhuis rand documentationrand 帮助文档都说它从开区间 (0,1) 中选择数字,所以我认为你是错的。关于转换,我不会费心去做,因为我不在乎我的 0/1 是否被表示为 4 或 1 字节整数,只是为了稍后打印它们。除非有一些速度上的好处,否则对我来说存储只是存储。关于 randrandi 的速度,你可能是对的,我从未检查过。但在这种情况下,你没有说服我结果是相同的,所以我选择正确性 :) - angainor
显示剩余6条评论

5
试试这个:
A = rand(50, 10) > 0.5;

n行的十进制等价数为:

 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快几倍。


5

另一个选项:

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

第n行的十进制等式如下所示:
 bin2dec(num2str(A(n,:)))

2

虽然其他答案可能更短,但我认为使用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关心的问题]:

tic; for i=1:1000;n = randi([0,2^10-1],50000,1,'uint16'); end;toc

Elapsed time is 1.341566 seconds.

计时器; 对于i = 1:1000; n = bsxfun(@(n,i)logical(bitget(n,i)), randi([0,2^10-1],50000,1,'uint16'),10:-1:1); end; 计时器结束

Elapsed time is 2.547187 seconds. 

tic; for i=1:1000;n = rand(50000,10)>0.5; end;toc

Elapsed time is 8.030767 seconds.

tic; for i=1:1000;n = sum(bsxfun(@times,rand(50000,10)>0.5,2.^(0:9)),2); end;toc
Elapsed time is 13.062462 seconds.

binornd 的速度更慢:

计时开始; 对于 i=1:1000, n = logical(binornd(ones(50000,10),0.5)); end; 计时结束

Elapsed time is 47.657960 seconds.

请注意,由于MATLAB保存逻辑值的方式(将位保存为字节...),这仍然不是最优的解决方法。

有趣的想法。但这是否假定比特本身是均匀分布的?这是真的吗?为什么A_bin矩阵的一半是零? - horchler
哎呀,我以为我的系统是小端字节序,所以bitget会从最高有效位开始计数,但显然不是这样。现在已经修复了。 - jan-glx
它确实假设比特位是均匀分布的,如果所有整数从0到2^nBits-1都是均匀分布的话,那么这种情况就成立了。不确定ML随机数生成器生成的伪随机数是否具有无偏性,我猜其他方法生成的随机数将更加独立,但这实际上取决于伪随机数生成器。 - jan-glx

0

或者你可以尝试这样做:

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

这样你还可以控制出现的概率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接