我们有一个MxN矩阵和一个约束cstrn = 100;
。
约束是列元素的总结限制(每列):
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
等。
提前谢谢。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:1)
这是一个逻辑,在移动设备上所以无法给出代码。
检查一下。转到列,按升序排序,循环求和,点击&lt; = 100时断开。得到反击。请参阅原始列,获取与您刚刚总结的元素匹配的元素索引:-)