【问题标题】:How to obtain a vector with the indexes of the elements given in a combination?如何获得具有组合中给定元素的索引的向量?
【发布时间】:2014-08-23 05:31:15
【问题描述】:

我有一个存储唯一面积值的向量。我正在使用 for 循环来生成一个数组,其中包含这些区域的每个可能组合的总和,如下所示:

A_values=[155 143 193.5 233.25 419.7 351.9 256.8 1054.9 997.5 997.5 726.2 73.5 66.8 62 82.5]

comb_sums=[];
indexes=[];
    for x=1:length(A_values)
      comb_sums=[comb_sums;
                sum(combntns(A_values,x),2)];
    end

现在我想获取每个组合中给出的元素的索引。例如,如果一些可能的给定组合是 [143]、[726.2 66.8] 和 [155 419.7 256.8],那么代码会给我一个这样的数组:

indexes=[ 2 0 0 0; 
          11 13 0 0;
          1 5 7 0];

我从 for 循环中得到的数组显然比上面 indexes 变量中给出的示例要大得多,所以 indexes 会也给我一个更大的数组。

【问题讨论】:

  • 你怎么知道indexes 会有 4 列?每次迭代不会改变吗?对于最终迭代,列数将是 length(A_Values)
  • 是的,你是对的!列数为长度(A_values)。我只是想给出一个关于我正在寻找的输出的简短示例,但没有注意到这一点。谢谢!

标签: arrays matlab indexing combinations


【解决方案1】:

您可以创建一个索引数组并在其上使用 combntns,就像您在 A_values 上所做的一样 -

nA = numel(A_values)
for k1 = 1:nA
    comb_out = combntns([1:nA],k1);
    indexes = [comb_out zeros(size(comb_out,1),nA - size(comb_out,2))]
end

如果您想将每次迭代的indexes 存储到一个名为indexes_all 的巨大数组中,您可以为每次迭代预先计算indexes 的大小,并使用它们为@987654327 预分配@。代码将是 -

%// Number of A_values to be used at various places in the code
nA = numel(A_values);

%// Get number of rows to be produced at each iteration
nrows = arrayfun(@(x) factorial(nA)/(factorial(x)*factorial(nA-x)),1:nA);

%// Preallocate with zeros as also needed in the desired output
indexes_all = zeros(sum(nrows),nA); 

off1 = 1; %// row-offset
for k1 = 1:nA
    comb_out = combntns(1:nA,k1); %// combntns on array of indices
    indexes_all(off1:off1+nrows(k1)-1,1:size(comb_out,2)) = comb_out; %// Store
    off1 = off1+nrows(k1); %// Update row-offset for next set of combinations
end

【讨论】:

  • 它似乎仍然缺少一些东西。输出的行数应该是找到的所有可能组合的总数。但是,您的代码似乎只给出了数组的最后一个向量。
  • @HelP 您是否查看了使用indexes_all 获取所有索引的新方法?
  • 哦抱歉,我没看到!这正是我一直在寻找的。谢谢!
  • @HelP 如果此解决方案充分回答了您的需求,请考虑通过单击答案左上角的 复选标记 来切换它来接受它从空心到绿色。
  • 我正在尝试在类似情况下使用相同的方法,但现在 nA=10252,所以 nrows 给了我一个 NaN 数组。您知道为什么会发生这种情况以及如何解决吗?当我尝试用零预分配时出现以下错误:??? Error using ==> zerosNaN and Inf not allowed.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
相关资源
最近更新 更多