我想在Matlab中创建一个500个单元格的矩阵(50行,10列),如何用随机二进制数字创建和初始化它?
我想要一个类似于50 * 10规模的东西
例如3 * 4样本
``` 0 1 1 1 0 0 0 0 1 1 1 1 ```
并且之后,如何获取任何一行的十进制等式?例如第一行等于十进制数7。
``` 0 1 1 1 0 0 0 0 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));
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关心的问题]:
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.
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.
A_bin
矩阵的一半是零? - horchler或者你可以尝试这样做:
A = binornd(ones(50,10),p);
true
和false
只是分别表示1
和0
的不同词。 - Rody Oldenhuisrand
从[0,1)
中均匀选择,所以命令rand>0.5
返回true
或false
的概率相等。请注意,在C/C++中,您可以生成随机的双精度数像这里,而随机整数则可以通过这里来实现。还请注意最后一个链接中靠近顶部几行下面的备注。我们无法确定Mathworks是否使用了C或Fortran来实现rand
和randi
,但根据这两个链接,rand
似乎更为可靠。 - Rody Oldenhuisrand
documentation 和rand
帮助文档都说它从开区间(0,1)
中选择数字,所以我认为你是错的。关于转换,我不会费心去做,因为我不在乎我的 0/1 是否被表示为 4 或 1 字节整数,只是为了稍后打印它们。除非有一些速度上的好处,否则对我来说存储只是存储。关于rand
与randi
的速度,你可能是对的,我从未检查过。但在这种情况下,你没有说服我结果是相同的,所以我选择正确性 :) - angainor