3

MxN 行列と Constraint があります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

前もって感謝します。

4

3 に答える 3

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
于 2012-12-05T17:15:52.770 に答える
3

ジョナスの答えに追加します。論理行列を出力し、その行列の 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
于 2012-12-05T17:22:37.903 に答える
1

これがモバイルでのロジックなので、コードを与えることはできません。

これをチェックしてください。列に移動し、昇順で並べ替え、ループして合計し、ヒット数が100未満の場合は中断します。カウンターを取得します。元の列に戻って参照し、合計した要素と一致する要素のインデックスを取得します:-)

于 2012-12-05T17:18:06.310 に答える