我想在 matlab 中创建一个包含 500 个单元格(50 行,10 列)的矩阵,如何通过随机二进制数字创建和初始化它?我想要一些 50*10 比例的东西作为样本 3*4
0 1 1 1
0 0 0 0
1 1 1 1
在它之后,如何获得任何行的十进制方程?就像第 1 行在十进制中等于 7
我想在 matlab 中创建一个包含 500 个单元格(50 行,10 列)的矩阵,如何通过随机二进制数字创建和初始化它?我想要一些 50*10 比例的东西作为样本 3*4
0 1 1 1
0 0 0 0
1 1 1 1
在它之后,如何获得任何行的十进制方程?就像第 1 行在十进制中等于 7
为什么不使用randi
生成随机整数?
A = randi([0 1], 50, 10);
并将二进制行转换为数字 - 如前面的答案:
bin2dec(num2str(A(n,:)))
尝试这个:
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
。
另外的选择:
A=round(rand(50,10));
第 n 行的十进制 eq 由下式给出:
bin2dec(num2str(A(n,:)))
通过其他更短的答案,我发现用 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 保存逻辑的方式,这仍然不是最优的。(位保存为字节...)
或者你可以这样尝试:
A = binornd(ones(50,10),p);
这样,您还可以选择控制发生概率。