R言語でテンソルを解析する_四則演算編
11/17追記
どうも計算が間違っていることに気がついたので修正中
R言語で疎テンソルを扱うために、slamを導入したが、slamでは要素に対する値の代入ができない。
例えば、dataという三階のテンソルのi,j,k要素のvalue(値)を10に変更するという処理
data[i,j,k]$v <- 10
などができない。
当然、テンソル同士の引き算などもできない。
しかたがないので、関数化する。
calc_simple_sparse_arrayにsimple_sparse_arrayのリストlist(data1,data2,data3)を突っ込むと、METHODで指定した処理がなされて帰ってくる。
例えばcalc_simple_sparse_array(list(data1,data2,data3), METHOD = 2)だと、+data1-data2-data3が帰ってくる。
paste.list <- function(...){ #内部処理高速化のための関数 return(paste(..., sep=":")) } calc_simple_sparse_array <- function(..., METHOD = 1) { #テンソルの和などをする関数 #...:simple_sparse_arrayのlist #METHOD:switch文参照 switch(METHOD, "1" = func <- function(x,y){ x + y }, "2" = func <- function(x,y){ x - y }, "3" = func <- function(x,y){ x * y }, "4" = func <- function(x,y){ x / y }, ) #ユニークなインデックスの組み合わせの探索 idx.mat <- unique(do.call(args = lapply(...,FUN = function(SSA){return(SSA$i)}),what = rbind)) tmp <- do.call(what=paste.list,args=as.data.frame(idx.mat)) idx.list <- lapply(...,FUN = function(SSA){ tmp.idx <- do.call(what=paste.list,args=as.data.frame(SSA$i)) tmp.idx <- match(tmp.idx,tmp) #tmp.idx <- tmp.idx[!is.na(tmp.idx)] return(tmp.idx) }) #数値ベクトルの生成 value.vec <- rep(0,dim(idx.mat)[1]) value.vec[ idx.list[[1]] ] <- ...[[1]]$v if(length(...) > 1){ for(i in 2:length(...)){ value.vec[ idx.list[[i]] ] <- func(value.vec[ idx.list[[i]] ], ...[[i]]$v) } } return(simple_sparse_array(i=idx.mat,v=value.vec)) }