2012-12-05 37 views
3

我们有一个MxN矩阵和一个约束cstrn = 100;Matlab:求和的列元素

的约束是列的元件(每列)的总结极限:

sum(matrix(:,:))<=cstrn

对于给定的例子如下所示:

Columns 1 to 5: 
    15 18 -5 22 19 
    50 98 -15 39 -8 
    70 -15 80 45 38 
    31 52 9 80 72 
    -2 63 52 71 6 
    7 99 32 58 41 

我想找到每谁完成这一约束列元素的最大数量。

我该如何总结每列元素与同列中的其他元素,并找出哪些总和组合使用每列最大元素数?

在给出的示例解决方案是:

4 3 5 2 5 

其中

column 1: 15 + 50 + 31 +7 +(-2)

column 2: 18 +(-15) + 52 or 63

预先感谢您。

回答

4

因为它总是更容易小元素融入的总和,你可以做一个sort,其次是累积和:

m= [ 
    15 18 -5 22 19 
    50 98 -15 39 -8 
    70 -15 80 45 38 
    31 52 9 80 72 
    -2 63 52 71 6 
    7 99 32 58 41]; 

cs = cumsum(sort(m)) 
cs = 
    -2 -15 -15 22 -8 
    5  3 -20 61 -2 
    20 55 -11 106 17 
    51 118 21 164 55 
    101 216 73 235 96 
    171 315 153 315 168 

现在你很容易地识别哪个元素,你跨越的门槛cnstrn(感谢,@sevenless)!

out = sum(cs <= cnstrn) 

out = 
    4  3  5  2  5 
+0

快速,准确的答案。谢谢@Jonas和所有回复他人的人。 – professor

1

这是一个逻辑,在手机上,所以不能给代码。

看看这个。转到列,按升序对其进行排序,循环总计,当命中< = 100时中断。获取计数器。回到原始列,得到与你刚刚总结的元素相匹配的元素索引:-)

3

我想补充Jonas的答案,你可以强加你的约束,输出一个逻辑矩阵然后求和1和0是矩阵的像这样:

cstrn = 100 
m= [ 
    15 18 -5 22 19 
    50 98 -15 39 -8 
    70 -15 80 45 38 
    31 52 9 80 72 
    -2 63 52 71 6 
    7 99 32 58 41]; 

val_matrix = cumsum(sort(m)) 
logical_matrix = val_matrix<=cstrn 
output = sum(logical_matrix) 

给予输出:

cstrn = 

    100 


val_matrix = 

    -2 -15 -15 22 -8 
    5  3 -20 61 -2 
    20 55 -11 106 17 
    51 118 21 164 55 
    101 216 73 235 96 
    171 315 153 315 168 


logical_matrix = 

    1  1  1  1  1 
    1  1  1  1  1 
    1  1  1  0  1 
    1  0  1  0  1 
    0  0  1  0  1 
    0  0  0  0  0 


output = 

    4  3  5  2  5 
+0

还要注意,你的例子应该有结果'4 3 5 2 5'而不是'5 3 5 2 5',如上所述。 – Sevenless

+0

+1! – Jonas

+0

结果部分更正了问题。谢谢@不用说。 – professor