如何获得具有组合中给出的元素的索引的向量?

时间:2014-08-23 05:31:16

标签: arrays matlab indexing combinations

我有一个存储唯一区域值的向量。我使用 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 循环得到的数组显然比上面 indices 变量中给出的示例大得多,所以索引会给我一个更大的阵列。

1 个答案:

答案 0 :(得分:0)

您可以创建索引数组并在其上使用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大小并将其用于为indexes_all预先分配。代码是 -

%// 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