11

我想在 matlab 中创建一个包含 500 个单元格(50 行,10 列)的矩阵,如何通过随机二进制数字创建和初始化它?我想要一些 50*10 比例的东西作为样本 3*4

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

在它之后,如何获得任何行的十进制方程?就像第 1 行在十进制中等于 7

4

5 回答 5

12

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

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

并将二进制行转换为数字 - 如前面的答案:

bin2dec(num2str(A(n,:)))
于 2012-10-14T06:44:36.843 回答
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

于 2012-10-14T06:24:26.543 回答
5

另外的选择:

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

第 n 行的十进制 eq 由下式给出:

 bin2dec(num2str(A(n,:)))
于 2012-10-14T06:31:18.503 回答
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 似乎并不重要]:

抽动;对于 i=1:1000;n = randi([0,2^10-1],50000,1,'uint16'); 结束;目录

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); 结束;目录

Elapsed time is 2.547187 seconds. 

抽动;对于 i=1:1000;n = rand(50000,10)>0.5; 结束;目录

Elapsed time is 8.030767 seconds.

抽动;对于 i=1:1000;n = sum(bsxfun(@times,rand(50000,10)>0.5,2.^(0:9)),2); 结束;目录

Elapsed time is 13.062462 seconds.

binornd甚至更慢:

抽动;对于 i=1:1000;n = 逻辑(binornd(ones(50000,10),0.5)); 结束;目录

Elapsed time is 47.657960 seconds.

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

于 2014-02-17T20:57:59.333 回答
0

或者你可以这样尝试:

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

这样,您还可以选择控制发生概率。

于 2013-05-24T19:37:19.877 回答