【问题标题】:Generating vectors in MATLAB在 MATLAB 中生成向量
【发布时间】:2011-01-21 14:10:58
【问题描述】:

我想知道 MATLAB 中是否有一种有效的方法来生成所有具有有限集合元素的固定长度向量。

例如,我如何构建所有长度为 5 且只有 0 或 1 作为元素的向量?

【问题讨论】:

    标签: matlab vector


    【解决方案1】:

    构建所有长度为 5 且只有 0 或 1 作为元素的向量的正确方法是

    a = dec2bin(0:31,5) - '0';
    

    我希望你明白为什么。

    【讨论】:

    • +1 不错的答案。唯一可能的缺点是 DEC2BIN 可能会痛苦地缓慢。
    • @gnovice:你让我去看看 DEC2BIN 源代码。是的,它可能效率不高——但它是如此可爱的单线!谢谢。
    • 习惯于不循环而不是循环。 >> tic,a=zeros(10,1024);for x=0:1023,a(:,x+1)=str2num(dec2bin(x,10)');end,toc 经过的时间是 0.105492 秒。 >> tic,a = dec2bin(0:1023) - '0';toc 经过的时间是 0.000868 秒。
    • @woodchips:嗯,-'0' 是一个我不知道的很酷的技巧,所以我不能向量化那个循环(当然我试过了)。谢谢!我将编辑我的答案 - 这使它成为一个单行。
    【解决方案2】:

    不是你需要的,但是 permv 生成向量排列。如果找不到精确解,可以调整向量排列。

    permv

    【讨论】:

    • 谢谢!我认为这正是我所需要的。
    • @Kiran:请记住,您必须首先选择一个由 1 和 0 组成的 5 元素向量,然后 PERMS 将为您提供所有排列。
    • 感谢您的提示,新手。这使我的代码比以前更快,这真的很好。
    【解决方案3】:

    MathWorks 的FileExchange 是你的朋友:

    所以使用第一个函数,就这么简单:

    VChooseKRO([0 1], 5)
    

    您甚至可以将其用于作为有限集的字符串元胞数组:

    C = {'a' 'b' 'c' 'd'};
    C( VChooseKRO(1:numel(C), 2) )
    

    【讨论】:

      【解决方案4】:

      新答案:

      您可以改用BITGET 函数来加速DEC2BIN 解决方案suggested by AB(在woodchips 的协助下)。有两种方法可以解决这个问题。第一个使用REPMAT 函数使输入大小相等(均为 32×5 矩阵):

      allCombos = bitget(repmat((0:31)',1,5),repmat(5:-1:1,32,1));
      

      第二个只是为您想要获得的每个单独的位调用一次BITGET

      vec = (0:31)';
      allCombos = [bitget(vec,5) bitget(vec,4) bitget(vec,3) ...
                   bitget(vec,2) bitget(vec,1)];
      

      以下是一些示例时间:

           Method      |  Average Time
      -----------------+------------------
        DEC2BIN        |   0.000788 s
        BITGET+REPMAT  |   0.000727 s
        BITGET x5      |   0.000045 s
      

      如您所见,展开后的BITGET 非常快。


      旧答案:(供后代使用)

      如果您想要构建一个由 每个可能的向量 组成的矩阵,该矩阵包含长度为 5 的零和一,这将是使用函数 PERMS 和 @987654329 的一种方法@(因为 PERMS 创建重复的行):

      allCombos = [0 0 0 0 0;
                   unique(perms([0 0 0 0 1]),'rows'); ...
                   unique(perms([0 0 0 1 1]),'rows'); ...
                   unique(perms([0 0 1 1 1]),'rows'); ...
                   unique(perms([0 1 1 1 1]),'rows'); ...
                   1 1 1 1 1];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多