所以我有以下约束:
如何以高效的方式在MATLAB中编写?输入为x_mn
,M
和N
。集B={1,...,N}
和集U={1,...,M}
我是这样做的(因为我写x
作为下面的向量)
x=[x_11, x_12, ..., x_1N, X_21, x_22, ..., x_M1, X_M2, ..., x_MN]
:
%# first constraint
function R1 = constraint_1(M, N)
ee = eye(N);
R1 = zeros(N, N*M);
for m = 1:M
R1(:, (m-1)*N+1:m*N) = ee;
end
end
%# second constraint
function R2 = constraint_2(M, N)
ee = ones(1, N);
R2 = zeros(M, N*M);
for m = 1:M
R2(m, (m-1)*N+1:m*N) = ee;
end
end
通过上面的代码,我将得到一个带A=[R1; R2]
的矩阵0-1
,我将A*x<=1
。
例如,M=N=2
,我会有这样的事情:
并且,我将创建一个函数test(x)
,它根据x
返回true或false。
我希望得到您的帮助并优化我的代码。
答案 0 :(得分:2)
您应将x_mn
值放在矩阵中。之后,您可以在每个维度中求和以获得您想要的内容。查看约束条件,您可以将这些值放在M x N
矩阵中,其中M
是行数,N
是列数。
您当然可以将值放在向量中并按照您之前的预期方式构造求和,但是您必须编写for
循环以在每次迭代中正确地对正确的元素进行子集,这是非常低效的。相反,请使用矩阵,并使用sum
对所需尺寸求和。
例如,假设您的x_mn
值介于1到20之间。B
位于从1
到5
的集合中,U
是在1
到4
的集合中。就这样:
X = vec2mat(1:20, 5)
X =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
vec2mat
采用向量并将其重新整形为矩阵。您指定所需的列数作为第二个元素,它将创建正确的行数以确保构建正确的矩阵。在这种情况下,我想要5列,所以这应该创建一个4 x 5
矩阵。
第一个约束可以通过以下方式实现:
first = sum(X,1)
first =
34 38 42 46 50
sum
适用于矢量以及矩阵。如果您有一个提供给sum
的矩阵,您可以指定第二个参数,告诉您要求总和的方向。在这种情况下,指定1
将对每列的所有行求和。它适用于第一个维度,即行。
这是在对B
的所有值U
中的所有可能值进行求和,这正是我们在这里所做的。您只需单独汇总每一列。
第二个约束可以通过以下方式实现:
second = sum(X,2)
second =
15
40
65
90
这里我们指定2
作为第二个参数,以便我们可以对每一行的所有列求和。第二个维度超过列。这样做是为了对U
的所有值B
中的所有可能值进行求和。基本上,您只需单独汇总每一行。
现在,如果你想检查是否满足第一个条件或第二个条件,你可以这样做:
%// First condition satisfied?
firstSatisfied = all(first <= 1);
%// Second condition satisfied
secondSatisfied = all(second <= 1);
这会检查first
或second
的每个元素,看看在我执行上述代码之后得到的总和是否都是<= 1
。如果他们都满足这个约束,我们将true
。另外,我们有false
。
如果您需要更多信息,请与我们联系。