在MATLAB中计算此求和的快速方法是什么?

时间:2014-06-18 21:57:23

标签: performance matlab optimization

所以我有以下约束: enter image description here

如何以高效的方式在MATLAB中编写?输入为x_mnMN。集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,我会有这样的事情: enter image description here

并且,我将创建一个函数test(x),它根据x返回true或false。

我希望得到您的帮助并优化我的代码。

1 个答案:

答案 0 :(得分:2)

您应将x_mn值放在矩阵中。之后,您可以在每个维度中求和以获得您想要的内容。查看约束条件,您可以将这些值放在M x N矩阵中,其中M是行数,N是列数。

您当然可以将值放在向量中并按照您之前的预期方式构造求和,但是您必须编写for循环以在每次迭代中正确地对正确的元素进行子集,这是非常低效的。相反,请使用矩阵,并使用sum对所需尺寸求和。

例如,假设您的x_mn值介于1到20之间。B位于从15的集合中,U是在14的集合中。就这样:

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);

这会检查firstsecond的每个元素,看看在我执行上述代码之后得到的总和是否都是<= 1。如果他们都满足这个约束,我们将true。另外,我们有false

如果您需要更多信息,请与我们联系。