【问题标题】:Create matrix with random binary element in matlab在matlab中创建具有随机二进制元素的矩阵
【发布时间】:2016-10-03 02:07:09
【问题描述】:

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

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

在它之后,如何得到任意行的十进制方程?比如第 1 行在十进制中等于 7

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 因为整数是整数,而布尔值是布尔值。即使在 Matlab 中,最好还是坚持打字:)
    • @RodyOldenhuis OP 想要二进制数字,而不是 truefalse。这意味着数字,而不是逻辑值。
    • 查看 here 以了解“二进制数字”的定义:) truefalse 分别是 10 的不同词。
    • @RodyOldenhuis 您生成随机双打并将它们转换为逻辑。我可以做同样的事情,只使用适当的函数来生成 [0 1] 中的随机整数代吗?我询问了使用randi 而不是rand。在您的方法中,找到两个数字的概率是否相等?
    • 是的,因为rand[0,1) 中统一选择,所以rand>0.5 命令以相同的概率返回truefalse。请注意,在 C/C++ 中,您将生成随机双精度数 like here,而随机整数的完成方式类似于 here。还要注意从最后一个链接顶部向下几行的注释。任何人都可以猜测 Mathworks 是否使用 C 或 Fortran 来实现 randrandi,但鉴于这两个链接,rand 似乎是一个更安全的选择。
    【解决方案2】:

    另一种选择:

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

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

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

    【讨论】:

      【解决方案3】:

      试试这个:

      A = rand(50, 10) > 0.5;
      

      nth 行的十进制等效值由下式给出:

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

      【讨论】:

        【解决方案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 似乎并不重要]:

        抽动;对于 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_bin 矩阵的一半为零?
        • Ups...我想,因为我的系统是小端序 bitget 会从最高有效位开始计数,显然不是。 - 现已修复。
        • 它确实假设位是均匀分布的,如果从 0 到 2^nBits-1 的所有整数都是均匀分布的,情况就是如此。不确定 ML 随机数生成器生成无偏伪随机数的效果如何,我猜其他方法生成的随机数会更加独立,但这实际上取决于伪随机数生成器。
        【解决方案5】:

        或者你可以这样尝试:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-30
          • 2016-08-31
          • 2014-10-22
          • 2015-09-06
          • 2015-11-26
          • 1970-01-01
          相关资源
          最近更新 更多