【问题标题】:Generate all possible column vectors in matlab在matlab中生成所有可能的列向量
【发布时间】:2017-05-26 18:39:15
【问题描述】:

我本质上是想弄清楚如何为 M 个对象的不同配置的基向量生成代码到 N 个不同状态(例如,如果我在 2 个孩子之间有 2 个零食,我可以有 (2,0) (0 ,2) 或 (1,1),糟糕的例子,但就是这样)

我正在努力弄清楚如何在不进入许多不同循环的情况下做到这一点(我希望这是自动的)。这个想法是创建一个矩阵,其中每一行都是长度为 M 的向量。我将从 vec(1) = N 开始,然后是一个 if 循环,其中 if sum(vec) == N, Matrix(1,:)=vec ;然后我可以采取 vec(1)=N-i 并做同样的事情。

我唯一的问题是我不知道如何使用 if 并忘记它,所以如果我在 5 个位置可能有 2 个对象,我将如何执行此操作以获得 (1 0 0 0 1)。

我不知道该怎么做。

【问题讨论】:

  • 因此,对于 5 个位置和 20 个对象,您的向量将包括 [14 0 3 2 1][2 1 3 9 5]?
  • 在交易所有一个函数叫做combn。检查它是否符合您的要求。

标签: matlab permutation


【解决方案1】:

你可以使用递归函数:

function out = combos(M,N)

if N == 1
  out = M;
else
  out = [];
  for i = 0:M
    subout = combos(M-i,N-1);
    subout(:,end+1) = i;
    out = [out;subout];
  end
end

【讨论】:

    【解决方案2】:

    我认为这可以满足您的需求。

    关键思想不是生成每个组中的元素数量,而是生成组之间的分割点。这可以通过重复组合来完成。 Matlab 的nchoosek 生成的组合不重复,但是这些很容易转换成我们需要的。

    M = 5; % number of objects
    N = 3; % number of groups
    t = nchoosek(1:M+N-1, N-1); % combinations without repetition...
    t = bsxfun(@minus, t, 1:N-1); % ...convert into combinations with repetition
    t = diff([zeros(size(t,1), 1) t repmat(M, size(t,1), 1) ], [], 2); % the size of each
        % group is the distance between split points
    

    在这个例子中,结果是

    t =
         0     0     5
         0     1     4
         0     2     3
         0     3     2
         0     4     1
         0     5     0
         1     0     4
         1     1     3
         1     2     2
         1     3     1
         1     4     0
         2     0     3
         2     1     2
         2     2     1
         2     3     0
         3     0     2
         3     1     1
         3     2     0
         4     0     1
         4     1     0
         5     0     0
    

    【讨论】:

      【解决方案3】:

      这与没有bsxfun 的 Luis 类似。因为我们不喜欢玩乐。

      n = 5;
      k = 3;
      
      c = nchoosek(n+k-1, k-1);
      result = diff([zeros(c, 1) nchoosek(1:(n+k-1), k-1) ones(c, 1)*(n+k)], [], 2) - 1;
      

      这将创建长度为k 的整数n 的分区。给定一个长度为n + (k-1) 的数组,我们找到(k-1) 的所有组合来在(一元)整数之间放置分区。对于 5 个项目和 3 个位置,我们有 7 个选择放置分区的位置:

      [ 0 0 0 0 0 0 0 ]
      

      如果我们选择的组合是[2 4],我们将位置24 替换为分区,如下所示:

      [ 0 | 0 | 0 0 0 ]
      

      O 给出一元的值,所以这个组合是1 1 3。为了轻松恢复这些值,我们只需在数组左侧和右侧(0n+k)的下一个值处增加虚构分区的组合,然后取差并减去 1(因为分区本身不'不贡献价值):

      diff([0 2 4 8]) - 1
      ans =
      
         1   1   3
      

      通过将分区滑入每个可能的位置组合,我们得到n 的所有分区。

      输出:

      result =
      
         0   0   5
         0   1   4
         0   2   3
         0   3   2
         0   4   1
         0   5   0
         1   0   4
         1   1   3
         1   2   2
         1   3   1
         1   4   0
         2   0   3
         2   1   2
         2   2   1
         2   3   0
         3   0   2
         3   1   1
         3   2   0
         4   0   1
         4   1   0
         5   0   0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多