なが月・46日目

46日目

午前

昨日作成したJSON+JavaScriptエクスプレッションによるアニメーションの成果を貼っておく。

f:id:napier_0b:20190916003521g:plain

使用したJSONとエクスプレッションは以下である。

{
    "someData": [7, 1, 4, 3, 5, 11, 7, 4, 10]
}
data = footage("myData.json").sourceData;
intTime = Math.floor(time * 2);

// elseがないとエラーになる Math.minで済ませるべきだが文法の備忘録として
if (intTime > 7) { intTime = 7; } else { intTime; }

// ease(proportion, startValue, endValue) 第一引数が0以下でstartValue, 1以上でendValueになるEase補間
y = ease((time * 2 - intTime) * 1.25, data.someData[intTime], data.someData[intTime + 1]);

//xはvalue[0]として不変 スケールの単位はパーセント
[value[0], 10 * y]
text.sourceText = Math.floor(thisComp.layer("yourShapeLayerNameHere").content("someRectName").transform.scale[1]) + "%";

さて疎行列の格納方法から再開する。非零要素が少ない疎行列で従来の二次元配列を用いると0ばかり格納することになり、無駄なメモリ領域確保とアクセスが行われることになる。そこで代表な方法として「各行の『行内最先非零要素』の『要素値配列におけるインデックス』」(以下最先要素インデックス)・「各非零要素の列番号」・「各非零要素の値」をそれぞれ別の配列に列挙する方法(CRS/CSR)がある。

この方法は空行を検出するために上の行または下の行の最先要素インデックスと比較せねばならず、そのためそれぞれ最先要素インデックス配列の先頭にゼロ、または末尾に非零要素の数に等しい値を追加しなければならない。英語版WikipediaSparse matrixでは先頭にゼロ法を使っているが、最先要素インデックス配列だけ行番号を1~Nで扱うことになり狂いそうになるので私は末尾追加法でやっている。

またこの方法では列番号配列、値配列が非零要素の個数に依存し、固定長配列で扱うのには不便である。C++なのでおとなしくstd::vectorを使った。しかも内部のループ回数はelementsInThisRowCountの数で変わってくるので、最適なスケジューリングが難しい。

そこで各行のうち最も非零要素数が多いものに合わせて配列長をそろえた二次元配列というやり方が登場する。Ellpackと呼ばれるこの方法は明日取り組みたい。

午後

所用で外出のため、帰宅後は3D素材を用意するための調査を行っていた。プロシージャル生成ができれば良いが、なかなかその方法も簡単には見当たらない。