R希罕矩阵转化稠密矩阵|使用as.matrix()报错:Cholmod error 'problem too

分享
藏宝库编辑 2024-9-21 17:38:17 30 0 来自 中国
在举行一些数据分析是常常会必要将一个数据对象转化为矩阵,以及希罕矩阵(sparse matrix)和稠密矩阵之间的互化。
题目&报错

在R情况中,用的非常广泛的函数就是as.matrix(),但是,当转化的希罕矩阵对象非常巨大的时间,比方细胞数目非常多的单细胞数据,R就会报如下雷同的错误:
Error in asMethod(object) :  Cholmod error 'problem too large' at file ../Core/cholmod_dense.c缘故原由&办理

这是由于as.matrix这个函数自己不支持大要量的希罕矩阵转换为稠密矩阵(也就是我们常规的矩阵),但假如采取用高级语言(比方R或python)循环填进去的方法的话,极其淹灭资源,以是可以选择直接修改该函数的底层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,cp) = z;  }  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,假如数据是浮点型必要把上述的IntegerMatrix替换为NumericMatrix,否则会强制转化为整型的矩阵。
构建希罕矩阵

别的,假如必要将稠密矩阵转化成为希罕矩阵,方法许多,先容一种使用
library("Matrix")dg <- as(matrix_object,"dgCMatrix")详细关于构建息争释希罕矩阵,可以参照:https://blog.csdn.net/jeffery0207/article/details/122507934
题外

末了,实在假如不想这么贫苦,又不想去sample随机取样缩减数据量,各人也不消那么枯燥,那就先把大矩阵拆分成几个小的,转完之后再合并就行了,结果是一样的,不好坏得一次性转完才算好,曲线救国的方式许多,bug自然就消散了。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 00:27, Processed in 0.158291 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表