2012-12-05 38 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