組込であると便利な配列の変形関数群
FLATTEN
2次元配列を1次元配列に変形
/**
* 2次元配列を配列を平坦にする
*
* @param {Range} range 2-dimensional array
* @return flatted array
* @customfunction
*/
function FLATTEN(range) {
return Array.prototype.concat.apply([], range);
}
CHUNK
1次元配列を n要素の2次元配列へ変形
※ この実装では Math.floorで配列長を決めているため、割り切れない場合の末尾は切り捨て
/**
* 指定された数の要素毎に配列を分割
*
* @param {4} n 分割する要素数
* @param {A1:A12} xs データ・ソースとなる配列
* @return n要素毎に分割された2次元配列
* @customfunction
*/
function CHUNK(n, xs) {
var length = Math.floor(xs.length/n);
var result = new Array(length);
for (var i = 0; i < length; ++i) {
result[i] = xs.slice(i*n, i*n+n);
}
return result;
}
RESHAPE
2次元配列の変形
/*
* 2次元配列の変形
*
* @param {Number} row 変形する行数
* @param {Number} col 変形する列数
* @param {Range} range 変換対象とする範囲
* @return 変形後の行列
* @customfunction
*/
function RESHAPE(row, col, range) {
var flatted = FLATTEN(range);
if (Math.floor(flatted.length/col) != row) { throw new Error("サイズが一致しません"); }
return CHUNK(col, flatted);
}
4列で折り返し表示のような場合は、CHUNK。空行を挟みたい場合などは縦横を入れ替える組み込み関数のTRANSPOSEで空列を含めて変形する、等。
プリミティブな操作なので応用範囲は広いはず。下図は、1x16 の範囲を 4x4 へ変形した例。

0 件のコメント:
コメントを投稿