From ruby-ext-admin@netlab.co.jp Sun Jan 24 10:28:06 1999 Received: from voscc.nagaokaut.ac.jp (voscc.nagaokaut.ac.jp [133.44.1.100]) by blade.nagaokaut.ac.jp (8.8.8/8.8.8/Debian/GNU) with ESMTP id KAA06388; Sun, 24 Jan 1999 10:28:06 +0900 Received: from hoyogw.netlab.co.jp (matz@localhost [127.0.0.1]) by hoyogw.netlab.co.jp (8.9.1a+3.1W/3.7W/1.3) with SMTP id KAA26555; Sun, 24 Jan 1999 10:27:35 +0900 Date: Sun, 24 Jan 1999 10:26:31 +0900 (JST) From: gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) Reply-To: ruby-ext@netlab.co.jp Subject: [ruby-ext:00070] MDArray#from_flat To: ruby-ext@netlab.co.jp (ruby-ext ML) Message-Id: <199901240126.KAA29219@hanare00.math.sci.hokudai.ac.jp> X-ML-Name: ruby-ext X-Mail-Count: 00070 X-MLServer: fml [fml 2.2]; post only (only members can post) X-ML-Info: If you have a question, send a mail with the body "# help" (without quotes) to the address ruby-ext-ctl@netlab.co.jp; help= X-Mailer: cmail 2.59.12 on GNU Emacs 19.34.5 / Mule 2.3 (SUETSUMUHANA) Mime-Version: 1.0 (generated by tm-edit 7.106) Content-Type: text/plain; charset=ISO-2022-JP Precedence: bulk Lines: 80 ごとけんです 伊藤彰則さん作の mdarray にひとつクラスメソッドを足しました. mda = MDArray.from_flat(size1,size2, ..., sizeN){ary} は大雑把に言って次の逆に相当します: ary = []; mda.each{|i| ary.push i} 要するに, ary = [e1,e2,...,eM] という平らな配列から, 全部でM個の要素からなるN次元配列 mda を作るものです. ただし,M == size1 × … × sizeN でなければ例外が 発生します. pbm(5) を矩形として読むようなときに便利だと思います. 気に入りそうなら使ってください. # あと,いくつかキャストが抜けてたので足しました. -- gotoken diff -u0r ext/mdarray.orig/README ext/mdarray/README --- ext/mdarray.orig/README Sun Jan 24 09:36:46 1999 +++ ext/mdarray/README Sun Jan 24 09:48:12 1999 @@ -80,0 +81,6 @@ + from_flat(size1, size2, ..., sizeN){array} + N次元配列を作り,ブロックを評価した値で初期化します. + ブロックを評価した値が配列でなければ例外が発生します. + 初期化は,array.each の順に取り出され,each の + 順に代入されます.作ったN次元配列の要素の総数と, + array の総数が一致しないときは例外が発生します. diff -u0r ext/mdarray.orig/mdarray.c ext/mdarray/mdarray.c --- ext/mdarray.orig/mdarray.c Tue Aug 26 13:48:13 1997 +++ ext/mdarray/mdarray.c Sun Jan 24 09:31:15 1999 @@ -163,0 +164,30 @@ + +/* class method: from_flat(array){array} */ +static VALUE +mda_from_flat(argc, argv) + int argc; + VALUE *argv; +{ + struct MD_ARRAY *mda; + VALUE ary; + int *args; + int i; + + if (!iterator_p()) + Fail("missing block"); + + if (argc == 0) + Fail("argument mismatch"); + else { + args = ALLOCA_N(int,argc); + for (i = 0; i < argc; i++) + args[i] = NUM2INT(argv[i]); + mda = alloc_MD_ARRAY(argc,args); + } + + ary = rb_yield(Qnil); + if (TYPE(ary) != T_ARRAY) + Fail("block value isn't Array"); + mda->ptr = RARRAY(ary)->ptr; + return Data_Wrap_Struct(cMDArray,mda_mark,mda_free,mda); +} @@ -301 +331 @@ - ary_store(vsize,i,INT2FIX(0)); + ary_store((VALUE)vsize,i,INT2FIX(0)); @@ -304 +334 @@ - rb_yield(vsize); + rb_yield((VALUE)vsize); @@ -311 +341 @@ - ary_store(vsize,i,INT2FIX(0)); + ary_store((VALUE)vsize,i,INT2FIX(0)); @@ -316 +346 @@ - ary_store(vsize,i,INT2FIX(size[i])); + ary_store((VALUE)vsize,i,INT2FIX(size[i])); @@ -438,0 +469 @@ + rb_define_singleton_method(cMDArray,"from_flat",mda_from_flat,-1);