matlab - (MATLAB) 线性方程的所有整数正解

标签 matlab math combinatorics discrete-mathematics

我想生成一个列表,名为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=5k=2 。 假设我得到以下列表:

 1     4
 2     3
 0     5
 5     0
 5     0
 0     5

如您所见,行 (5,0) 和行 (0,5) 各重复两次。我想要获得唯一的行。

更准确地说,对于 d=5k=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=5k=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/

相关文章:

flutter - 确定一个 Map 是否是另一个 Map 的子集

matlab - MatLab 中的数值不稳定性卡尔曼滤波器

matlab - 如何分离颜色errorbar matlab

matlab - 查找由区域掩码表示的多边形的角

matlab - 多轴断裂

java - 100.000 个 vector 的高效比较

c++ - 生成不是彼此镜像的排列

algorithm - 生成集合的所有分区

ubuntu - 如何从 Dieharder 测试套件中获取随机数?

algorithm - 在给定的分子和分母范围内,找到 0..1 之间给定随机实数最接近的整数分数