向量列表,其元素总和等于循环变量
List of vectors, whose sum of elements equal to the loop variable
我想创建一个向量列表,其中列表中每个向量的元素总和为循环变量,而不考虑元素的顺序和重复。
例如
k=1, list ={[1]};
k=2, list ={[1,1],[2]};
k=3, list ={[1,1,1],[1,2],[2,1],[3]};
k=4, list ={[1,1,1,1],[1,3],[3,1],[2,2],[2,1,1],[1,2,1],[1,1,2],[4]};
等等。
列表的长度是$2^{k-1}$。在 MATLAB 中有什么简单的策略可以做到这一点吗?
有一个简单的递归策略:如果你有一个整数分区列表和一些k-1
,很容易生成总和k
的分区:给定一些分区,我们可以附加一个 1 来创建一个新分区,或者我们可以只增加最后一个条目。所以这样的事情应该有效。
k = 5;
sumk = {[1]}; % anchor
for current_sum = 2:k % recursion
new_sumk = {};
% (a) create new list by appending an 1
new_append = cellfun(@(x)[x,1], sumk, 'Un', 0);
% (b) create new list by increasing last element
new_increment = cellfun(@(x)[x(1:end-1), x(end)+1], sumk, 'Un', 0)
sumk = [new_append, new_increment];
end
% print the whole thing:
for l = 1:length(sumk)
disp(sumk{l})
end
我想创建一个向量列表,其中列表中每个向量的元素总和为循环变量,而不考虑元素的顺序和重复。 例如
k=1, list ={[1]};
k=2, list ={[1,1],[2]};
k=3, list ={[1,1,1],[1,2],[2,1],[3]};
k=4, list ={[1,1,1,1],[1,3],[3,1],[2,2],[2,1,1],[1,2,1],[1,1,2],[4]};
等等。 列表的长度是$2^{k-1}$。在 MATLAB 中有什么简单的策略可以做到这一点吗?
有一个简单的递归策略:如果你有一个整数分区列表和一些k-1
,很容易生成总和k
的分区:给定一些分区,我们可以附加一个 1 来创建一个新分区,或者我们可以只增加最后一个条目。所以这样的事情应该有效。
k = 5;
sumk = {[1]}; % anchor
for current_sum = 2:k % recursion
new_sumk = {};
% (a) create new list by appending an 1
new_append = cellfun(@(x)[x,1], sumk, 'Un', 0);
% (b) create new list by increasing last element
new_increment = cellfun(@(x)[x(1:end-1), x(end)+1], sumk, 'Un', 0)
sumk = [new_append, new_increment];
end
% print the whole thing:
for l = 1:length(sumk)
disp(sumk{l})
end