2

異なるサイズのボックスを開梱または開くと、数字の場合は0で、リテラルの場合はスペースでパディングされます。

v=.1 4 8 ; 2 6 4 ; 6 8 4 5; 7 8 9; 6 3 7 4 9

>v
1 4 8 0 0
2 6 4 0 0
6 8 4 5 0
7 8 9 0 0
6 3 7 4 9

フィット(!.)接続詞は通常、これらのものに使用するものですが、

>!. _1 v

サポートされておらず、ドメインエラーをスローします。

私はこれを持っていますが、非常に大きな配列ではそれほど速くありません:

(>./ # every y) {.!. _1 every y

ボックスを開くためのパディング値を定義する効率的な方法はありますか?

4

2 に答える 2

1

設定

f =: 3 :'(>./ # every y) {.!. _1 every y'
g =: _1&paddedOpen

そして(あなたと同じ精神でf):

h =: 3 : '((>./# &> y)&($!._1))@> y'

時間と空間で次のようなパフォーマンスがあります。

(100&(6!:2) ,: 7!:2) &.> 'f L';'g L';'h L'
┌─────────┬─────────┬─────────┐
│ 0.045602│0.0832403│0.0388146│
│4.72538e6│1.76356e7│4.72538e6│
└─────────┴─────────┴─────────┘

ここで、Lは大きな配列です。

L =. (<@(+i.)/)"1 ? 50000 2 $ 10

f簡潔にすることで少し改善できます。例えば:

f =: ] {.!._1&>~ >./@:(#&>)

まだまだ改善の余地はないと思います。

于 2012-12-12T00:49:26.323 に答える
1

特に必要性がデータの特定の構造に制限されている場合(おそらくあなたの例で示唆されているように)、パディングを直接行うことが効率への道になると思います。このソリューションはパフォーマンス分析の対象ではありませんが、パディングを自分で行う方法。

ここでは、ボックス化されたリストからテーブルに移動するタスクが常に含まれており、データは常に数値であると仮定しています。適切な引数が期待どおりであることを確認するために、追加のassert.ステートメントを追加する価値がある場合があります。

   v=.1 4 8 ; 2 6 4 ; 6 8 4 5; 7 8 9; 6 3 7 4 9   NB. example data

paddedOpen=: dyad define
 assert. 0 = # $ x
 Lengths=. #&> y
 PadTo=. >./ Lengths
 Padding=. x #~&.> PadTo - Lengths
 y ,&> Padding
)

   _1 paddedOpen v
1 4 8 _1 _1
2 6 4 _1 _1
6 8 4  5 _1
7 8 9 _1 _1
6 3 7  4  9

デフォルト値を仲介として使用できない場合にのみ、カスタマイズされた値で最初にパディングすることが重要です。デフォルト値を渡すときに使用できる場合は、デフォルトのパディングを発生させてから、すべてのデフォルト値を優先値に置き換える方が高速です。あなたの質問の性質から、デフォルト値はメインドメインで意味があると思いますので、単純な置き換えは役に立ちません。

さまざまな手法の相対的なパフォーマンス、または少なくとも 1 つの手法が目的に対して十分に高速であることが証明されているかどうかについて、コメントを残してください。

于 2012-12-11T20:35:36.667 に答える