我有一个存储唯一区域值的向量。我使用 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 变量中给出的示例大得多,所以索引会给我一个更大的阵列。
答案 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