我想生成一个列表,名为listt
,包含所有可能的正整数,总和为特定数字 d
。例如,我正在查看 x's
所有可能的正整数值的列表。这样x1 + x2 + ... + xk = d
.
在本例中,行大小为 listt
应该是(d+k-1) choose (k-1)
.
我已经有了 MATLAB code
这样做(见下文),但主要问题是此代码允许 listt
中出现重复行。 我需要帮助才能更改此代码,以确保 listt
中没有重复的行.
k = 2;
d = 2;
m = nchoosek(d+k-1, k-1);
% generate non-negative integer random (m x k) array row-sum to d
ss=rand(m,d+k-1);
[~,r] = maxk(ss,k-1,2);
z = zeros(m,1);
listt = diff([z, sort(r,2), (d+k)+z],1,2)-1;
比方说d=5
和k=2
。
假设我得到以下列表:
1 4
2 3
0 5
5 0
5 0
0 5
如您所见,行 (5,0) 和行 (0,5) 各重复两次。我想要获得唯一的行。
更准确地说,对于 d=5
和k=2
,我想要得到的到底是以下所有6种可能性:
1 4
2 3
0 5
5 0
4 1
3 2
任何帮助将不胜感激!
最佳答案
令d
表示所需的总和,k
表示分量的数量。
d = 5; % desired sum
k = 2; % desired number of components
b = nchoosek(1:d+k-1, k-1);
t = [ones(size(b,1),1) b+1 repmat(d+k+1, size(b,1),1)];
result = diff(t, [], 2)-1;
该代码的工作原理是将每个解决方案表示为一个行向量,其中包含从 1
开始、到 d+k+1
结束的 k+1
递增整数。 code> (代码中的矩阵 t
)。 k-1
内部整数是使用 nchoosek
生成的。然后从这些整数之间的 k
个连续差异中获得实际的解决方案。
例如,输入 d=5
和 k=2
的矩阵 t
为
1 2 8
1 3 8
1 4 8
1 5 8
1 6 8
1 7 8
给出结果
0 5
1 4
2 3
3 2
4 1
5 0
关于matlab - (MATLAB) 线性方程的所有整数正解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77629165/