R稀疏矩陣轉化稠密矩陣|使用as.matrix()報錯:Cholmod error 'problem too large'

在進行一些數(shù)據(jù)分析是經(jīng)常會需要將一個數(shù)據(jù)對象轉化為矩陣,以及稀疏矩陣(sparse matrix)和稠密矩陣之間的互化已骇。

問題&報錯

在R環(huán)境中颤陶,用的非常普遍的函數(shù)就是as.matrix(),但是臀栈,當轉化的稀疏矩陣對象非常巨大的時候,例如細胞數(shù)目非常多的單細胞數(shù)據(jù)玫锋,R就會報如下類似的錯誤:

Error in asMethod(object) :
  Cholmod error 'problem too large' at file ../Core/cholmod_dense.c

原因&解決

這是因為as.matrix這個函數(shù)本身不支持大體量的稀疏矩陣轉換為稠密矩陣(也就是我們常規(guī)的矩陣)蛾茉,但如果采取用高級語言(例如R或python)循環(huán)填進去的方法的話,極其耗費資源撩鹿,所以可以選擇直接修改該函數(shù)的底層C++語言谦炬,來解決這個問題:

library(Rcpp)
Rcpp::sourceCpp(code='
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
IntegerMatrix asMatrix(NumericVector rp,
                       NumericVector cp,
                       NumericVector z,
                       int nrows,
                       int ncols){
  int k = z.size() ;
  IntegerMatrix  mat(nrows, ncols);
  for (int i = 0; i < k; i++){
      mat(rp[i],cp[i]) = z[i];
  }
  return mat;
}
' )

as_matrix <- function(mat){
  row_pos <- mat@i
  col_pos <- findInterval(seq(mat@x)-1,mat@p[-1])
  tmp <- asMatrix(rp = row_pos, cp = col_pos, z = mat@x,
                  nrows =  mat@Dim[1], ncols = mat@Dim[2])
  row.names(tmp) <- mat@Dimnames[[1]]
  colnames(tmp) <- mat@Dimnames[[2]]
  return(tmp)
}
as_matirx() #接下來調用即可

PS,如果數(shù)據(jù)是浮點型需要把上述的IntegerMatrix替代為NumericMatrix节沦,不然會強制轉化為整型的矩陣键思。

構建稀疏矩陣

此外,如果需要將稠密矩陣轉化成為稀疏矩陣甫贯,方法很多吼鳞,介紹一種使用

library("Matrix")
dg <- as(matrix_object,"dgCMatrix")

具體關于構建和解釋稀疏矩陣,可以參照:https://blog.csdn.net/jeffery0207/article/details/122507934

題外

最后叫搁,其實如果不想這么麻煩赔桌,又不想去sample隨機取樣縮減數(shù)據(jù)量,大家也不用那么死板渴逻,那就先把大矩陣拆分成幾個小的疾党,轉完之后再合并就行了,效果是一樣的裸卫,不是非得一次性轉完才算好仿贬,曲線救國的方式很多,bug自然就消失了墓贿。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜓氨,隨后出現(xiàn)的幾起案子聋袋,更是在濱河造成了極大的恐慌,老刑警劉巖穴吹,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幽勒,死亡現(xiàn)場離奇詭異,居然都是意外死亡港令,警方通過查閱死者的電腦和手機啥容,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門锈颗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咪惠,你說我怎么就攤上這事击吱。” “怎么了遥昧?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵覆醇,是天一觀的道長。 經(jīng)常有香客問我炭臭,道長永脓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任鞋仍,我火速辦了婚禮常摧,結果婚禮上,老公的妹妹穿的比我還像新娘威创。我一直安慰自己排宰,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布那婉。 她就那樣靜靜地躺著板甘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪详炬。 梳的紋絲不亂的頭發(fā)上盐类,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音呛谜,去河邊找鬼在跳。 笑死,一個胖子當著我的面吹牛隐岛,可吹牛的內(nèi)容都是我干的猫妙。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼聚凹,長吁一口氣:“原來是場噩夢啊……” “哼割坠!你這毒婦竟也來了?” 一聲冷哼從身側響起妒牙,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤彼哼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后湘今,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敢朱,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拴签。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孝常。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚓哩,靈堂內(nèi)的尸體忽然破棺而出构灸,到底是詐尸還是另有隱情,我是刑警寧澤杖剪,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布冻押,位于F島的核電站,受9級特大地震影響盛嘿,放射性物質發(fā)生泄漏洛巢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一次兆、第九天 我趴在偏房一處隱蔽的房頂上張望稿茉。 院中可真熱鬧,春花似錦芥炭、人聲如沸漓库。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渺蒿。三九已至,卻和暖如春彪薛,著一層夾襖步出監(jiān)牢的瞬間茂装,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工善延, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留少态,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓易遣,卻偏偏與公主長得像腋妙,于是被迫代替她去往敵國和親偷溺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容