分からんこと多すぎ

何故か就職できたので技術磨く。一人前の多重線形代数使いを目指しつつ、機械学習、データマイニングをやる

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))
}