【问题标题】:What is the fast way to calculate this summation in MATLAB?在 MATLAB 中计算这个总和的快速方法是什么?
【发布时间】:2014-06-18 21:57:23
【问题描述】:

所以我有以下限制:

如何在 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,我会有这样的东西:

然后,我将创建一个函数test(x),它根据x 返回真或假。

我想从你那里得到一些帮助并优化我的代码。

【问题讨论】:

    标签: performance matlab optimization


    【解决方案1】:

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

    您当然可以将您的值放在一个向量中并按照您之前想要的方式构建您的求和,但是您必须编写for 循环来正确地对每次迭代中的正确元素进行子集化,这是非常低效的。相反,请使用矩阵,并使用sum 对您想要的维度求和。

    例如,假设您的 x_mn 的值介于 1 到 20 之间。B 位于 15 的集合中,U 位于 1 到 @987654333 的集合中@。因此:

    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 的每个元素,并查看执行上述代码后的结果总和是否都是&lt;= 1。如果它们都满足这个约束,我们将拥有true。否则,我们有false

    如果您需要任何进一步的信息,请告诉我。

    【讨论】:

    • 谢谢。在我的代码中,在得到R1R2 之后,我将它们放入矩阵A=[R1;R2] 中,例如,我有两个向量x1 等于x1=[1 0 1 0]x2,它们是相等的到x2=[1 0 0 1]。因此,当我执行A*x1 时,我将得到false,当我执行A*x2 时,我将得到true
    • 这是一个错误。请参阅我的评论。
    • 没问题。我很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多