Subject | : Re: Transposeについて |
Article No | : 1157 |
Date | : 2014/02/26(Wed) 18:22:27 |
Contributor | : Anonymous |
> 広島大学の清宮です。 > > Transposeを使った場合、以下のようにTranspose内のリスト(a,bなど)まで変化するようですが、これは仕様でしょうか。 > Threadで計算すると、変化しないようです。 > よろしくお願い致します。 > > Design orbit length = 1.0000000000000000 > > a={0.1,0.2,0.3}; > b={1,2,3}; > num={10,20,30}; > list=Transpose[{a,b,num}]; > > a > Out[1]:= {.1,1,10} > b > Out[2]:= {.2,2,20} > num > Out[3]:= {.3,3,30} > list > Out[4]:= {{.1,1,10},{.2,2,20},{.3,3,30}} > stop; > tftranspose@src/tfdot.fの実装バグ
実正方行列の一時オブジェクトを受け取った際に、新規にオブジェクトを割り当てずに受け取った 一時オブジェクトを書き換えて返すメモリ割り当て最適化が仕込まれているが、判定条件が誤爆している
当該ケースでは、List {a,b,num}は一時オブジェクトであるが、第2レベルはシンボル参照 a, b, numを持つ Listオブジェクトの参照であるので、第2レベルの実数リストオブジェクトは再利用出来ない(第1レベルのリストは再利用可能) しかし、再利用判定では、第1レベルのリストの属性のみを検査している
k64-1-6 branchに関しては、オブジェクトオペレータ書き換え時に一時オブジェクト再利用最適化が脱最適化されているので影響無し
Solution: A. 真面目に再利用判定条件を実装する B. 脱最適化する
|