4

R コードの一部を pdl を使用して perl に変換しようとしていますが、pdl にシーケンスを作成するための構文があるかどうかを知りたいです (些細な my $xx=pdl(1..20) 以外に)。

ベクトル ['a','b'] rep 20 => a,b,a,b,a,b.... 20 回のようなものですか? [編集]: 基本的な繰り返しは通常の Perl 繰り返し文字列x演算子で実行できますが、R で rep() や seq() のようなものを探しています:

[R]
> rep(1:3, each=2, times=3)
1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
> rep(1:4, c(1,2,3,2))
1 2 2 3 3 3 4 4
> seq(0,12,3)
0 3 6 9 12
4

5 に答える 5

3

PDL 固有の構文については知りませんが、Perl ではx演算子を使用してリストの要素を繰り返すことができます。多分

$xx = pdl(  ('a','b') x 20   );

動作します。

于 2011-07-08T16:31:30.793 に答える
3

PDLには具体的にはseq()ありませんが、rep()コンストラクターと、多次元データを操作および再形成する機能があります。

具体的には、これらのサイズのダミー次元を元のデータに追加し、結果を 1 次元に再形成することで、シーケンスを複製できます。

start:stop:stride を持つシーケンスは、sequence() コンストラクターで生成できる整数のシーケンスに対する算術演算によって生成できます。

以下は、元の質問の 2 つの R スニペットに対応するいくつかの PDL バージョンで、対応関係を説明するコメントが付いています。

pdl> pdl(1..3)                  # 1:3
$PDL1 = [1 2 3];

pdl> pdl(1..3)->(*2)->flat      # rep(1:3, each=2)
$PDL1 = [1 1 2 2 3 3];

pdl> pdl(1..3)->(,*3)->flat     # rep(1:3, times=3)
$PDL1 = [1 2 3 1 2 3 1 2 3];

pdl> pdl(1..3)->(*2,,*3)->flat  # rep(1:3, each=2, times=3)
$PDL1 = [1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3];

pdl> rld(pdl(2,1,5),pdl(1..3))  # rep(1:3, c(2,1,5))
$PDL1 = [1 1 2 3 3 3 3 3];


pdl> sequence(13)->(0:12:3)     # seq(0,12,3)
$PDL1 = [0 3 6 9 12];

ベクトル演算rldを実行するために、ランレングス デコード コマンドを使用することに注意してください。repこれらの種類のインデックスとディメンションの操作を使用して R ルーチンを実装するのは簡単です。また、上記は主に整数インデックス操作で機能します。浮動小数点数のサポートが必要な場合は、別のことを行う必要があります。

PDL::BasicシーケンスのものとPDL::Slicesインデックス操作については参照してください(PDL::NiceSlice上記で使用されている構文であるため、これも関連しています)。PDL シェルperldlまたはpdl2.

PDL Web サイトはhttp://pdl.perl.orgにあります。PDL に関するさらなる議論については、perldl メーリング リストを使用して、PDL コミュニティ全体による迅速な対応をお願いします。

于 2012-04-20T21:58:28.353 に答える
1

ここで、sequence() 関数と行列に関するいくつかの興味深い点を示します。

$x = sequence(20)*2+1; ##odd
[1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39]
$x = sequence(20)*2;  ##even 
[0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38]
$x = sequence(20)%2; ## binary pattern
[0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1]
$x = sequence(20)%10  ## position matrix
[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]
$x = sequence(20)<=>10;  ## ray matrix
[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 1 1 1 1 1 1 1 1]
$x = sequence(20)%4+2;  ## repeating pattern
[2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5]
$x = sequence(20)%6;  ##  notice how this is different 
[0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1]
于 2016-01-30T10:01:24.487 に答える
1

pdl他の人が言ったように、Perl を使用してコンストラクターに渡す方が簡単な例もあります。ただし、最後の例は簡単です。

$x = 3*xvals(5);
print $x; # [0 3 6 9 12]

ちょっとした作業の後、R を知らなかったので、質問は適切に形成されているのだろうか? 私は、いくつかの新しいpdl_rep関数への入力が基本ピドルであり、次にいくつかの繰り返し仕様であると想定し始めました。しかし、ベースピドルが単純なベクトルよりも高次元である場合、どうすればよいか疑問に思い始めました。したがって、1D 入力のみに落ち着きました。次に、私や他の人が言ったように、coreach型のアクションを実行するには、基本ピドルを分解して Perl レベルで要素を操作し、ピドルを再構築するか、ばかげた次元操作を行う必要があることに気付きました。これらすべての結果として、そのような関数を作成する最も簡単な方法は、それ自体を pdl コンストラクターにすることであると思われました。

この結論に達すると、よく構築されたマップ操作から実際にピドルを構築することが、あなたが意図していることであることに気付きました。PDL は、Perl のパワーを活用することを目的としています。それ以外の場合は、別の言語になります。このrep関数は、Perl が既に持っているため、設計者によって実装されていない可能性があります。

おそらくTL;DRですが、あなたの短い答えは、PDLの使用にPerlの恩恵も与えることだと思います!

于 2011-09-24T13:54:09.137 に答える