これまでj-oshiro@grsなんちゃらというメールアドレスを利用していましたが,ドメインの頭部分が変わります.
j-oshiro [at] cs.u-ryukyu.ac.jp
となりました.私にメールでご連絡いただける際はよろしくお願いします.grsドメインはしばらくすると使えなくなるようです.
職場が変わったわけではありません (新たに大学院で授業担当教員を務めることにはなりましたが).
これまでj-oshiro@grsなんちゃらというメールアドレスを利用していましたが,ドメインの頭部分が変わります.
j-oshiro [at] cs.u-ryukyu.ac.jp
となりました.私にメールでご連絡いただける際はよろしくお願いします.grsドメインはしばらくすると使えなくなるようです.
職場が変わったわけではありません (新たに大学院で授業担当教員を務めることにはなりましたが).
Mathematicaで以前からこれが遅くなる原因ではないか…と思っていた部分を検証したのでメモ.
Mathematicaの代入
expr /. {replace1 -> value1, replace2 -> value2, ...}
は,代入されるもの・代入するものが多いと遅くなる (vectorizationできるならすべき).
これの類推で,expr (ここでは行列) の一部を書き換える関数ReplacePart
ReplacePart[expr, {{i1,j1} -> value1, {i2,j2} -> value2, ...}]
をTableを用いて
ReplacePart[expr, Table[position[[i]] -> value[[i]], {i, Length@position}]]
のように書くのは遅くなる原因なのだろうか (7年ぐらい前に書いたコードはこれ).
MapThreadを使うとベクトルをベクトル表記のまま同じことができる:
ReplacePart[expr, MapThread[Rule, {position, value}]]
ので,Tableを使う場合とMapThreadを使う場合で差が出るか見てみた.
MapThreadのほうが1割ぐらい速かった.実行環境はやや古いiMacのMathematica14.0.0.
以下コード.
pattern01[nrow_, ncol_, nreplace_, nDo_] :=
Module[{timebegin, mat, replacePosition, newValue},
(* record computational time *)
timebegin = SessionTime[] ;
(*"set seed"*)
ParallelEvaluate[SeedRandom[1]] (* enable to be replicated *);
Do[
(* a matrix that I want replace with newValue *)
mat = RandomReal[1, {nrow, ncol}];
(* positions of mat to be replaced.
the number of replace is at most nreplace. *)
replacePosition =
DeleteDuplicates@
Transpose@{RandomInteger[{1, nrow}, nreplace],
RandomInteger[{1, ncol}, nreplace]};
(* new values (taking Exp is optional) *)
newValue = Exp@RandomReal[1, Length@replacePosition];(*
replacepart with Table *)
mat =
ReplacePart[mat,
Table[replacePosition[[i]] -> newValue[[i]], {i,
Length@replacePosition}] ];,
nDo] (* end of Do *);
Print[ToString@(SessionTime[] - timebegin) <> " sec"];
Return@DateString[]
]
pattern02[nrow_, ncol_, nreplace_, nDo_] :=
Module[{timebegin, mat, replacePosition, newValue},
(* record computational time *)
timebegin = SessionTime[] ;
(*"set seed"*)
ParallelEvaluate[SeedRandom[1]] (* enable to be replicated *);
Do[
(* a matrix that I want replace with newValue *)
mat = RandomReal[1, {nrow, ncol}];
(* positions of mat to be replaced.
the number of replace is at most nreplace. *)
replacePosition =
DeleteDuplicates@
Transpose@{RandomInteger[{1, nrow}, nreplace],
RandomInteger[{1, ncol}, nreplace]};
(* new values (taking Exp is optional) *)
newValue = Exp@RandomReal[1, Length@replacePosition];(*
replacepart with MapThread *)
mat =
ReplacePart[mat, MapThread[Rule, {replacePosition, newValue}] ];,
nDo] (* end of Do *);
Print[ToString@(SessionTime[] - timebegin) <> " sec"];
Return@DateString[]
]
"Parallel Karnels" (* 使ってないけど *)
LaunchKernels[];
"run (execution requires about 20min)"
(* 16384x128行列のうち最大1024箇所を書き換える,を65536回実行 *)
pattern01[2^14, 2^7, 2^10, 2^16]
(* 1420 sec *)
pattern02[2^14, 2^7, 2^10, 2^16]
(* 1318 sec *)
Parallelize@ReplacePartのようにして並列化はできなさそう.
先日インタビューを受け,記事にしていただきました.インタビューというよりゆるい雑談でとりとめもない感じではありますが.
HUB沖縄: これからの沖縄振興について今一度考えてみる 第6次計画を読み解く
沖縄振興政策はとくに専門でもなく,生半可な知識と考察で触れてやけどしているかもしれません.EBPMについて上から目線で偉そうに言ってますが地方政府には地方政府なりの事情があるとは思います.
インタビューを受けた後に西銘大臣ビジョンが出て,政府と県がバチバチやり合う政治イシューになっている感もありますが,私は政治に興味が薄くまた巻き込まれたくないという気持ちも強いですよろしくお願いします.
インタビューで話題にならなかったものの,言っておくべきことはもっとあったような気がするので以下思いつくままに私の感じ方を挙げておきます.専門じゃなく,無責任な思いつきレベルですが.
2022年4月1日より県内で異動することになりました.
前職には思い出と愛着が多々あり,離れるのが惜しいところです.27歳で着任してから9年間という,私のキャリアの重要な期間を,充実したものとすることができました.
新しい環境で気持ちを新たにし,研究・教育に尽くして参ります.今後とも変わらぬご指導ご鞭撻のほどお願いいたします.
--
前職は優秀な若手を積極的に採用しており,楽しい快適な職場です.研究に専念しやすい希有な環境だと思います.沖縄は花粉もありません.jrecinより経済学の公募が出ていますので,ふるってご応募いただければ幸いです.
--
メールアドレスは,既存のものとユーザー名は変わらず,ドメインがgrs.u-ryukyu.ac.jpに変わります.
--
長期金利の雲行きが…という状況でいろいろ思うところはありますが,家を買いました.向こう数十年は沖縄にロックインされると思います.
ただいま引っ越しの準備中です.あいむ・こんぽーじんぐ!
![]() |
| Fig. 1. |
![]() |
| Fig. 2. |
年暮れぬ笠きて草鞋はきながらそういうわけで年末年始は一層世俗を離れ放浪する.また来年.