R相当于Matlab cell2mat的功能?

时间:2014-07-03 14:27:32

标签: r matlab

我对R或Matlab不太熟悉,我正在尝试将Matlab代码转换为R.问题是,我不确定代码的作用。这是我遇到问题的matlab专线:

Wi = cell2mat(accumarray(s_group,s_u,[],@(x){repmat(sqrt(sum(x.*x)+eps),length(x),1)}));

我找不到与matlab中的cell2mat做同样事情的R函数。 当我用我的示例数据运行代码时,matlab给了我一个长度为86的数组,它与s_group和s_u变量的长度相同。 但是,当我使用与此R代码相同的数据时:

Wi<-accumarray(s_group,s_u,sz=c(nrow(s_group),ncol(s_group)),func=function(x) matrix(sqrt(x*x),length(x),1))

它给了我错误

Error in accumarray(s_group, s_u, sz = c(length(s_group), 1), func = function(x) matrix(sqrt(x *  : 
Argument 'sz' does not fit with 'subs'.

我也尝试过没有指定尺寸:

Wi<-accumarray(s_group,s_u,func=function(x) matrix(sqrt(x*x),length(x),1))

这给了我一个长度为21的数组,错误是:

In A[i] <- func(val[subs == i]) :
number of items to replace is not a multiple of replacement length

以下是Matlab的原始for循环版本:

group_set = unique(group);
group_num = length(group_set);
Wi = zeros(n_XVar, 1);
for c = 1:group_num
     idx = find(group==group_set(c));
     Wc = u(idx,:);
     di = sqrt(sum(sum(Wc.*Wc))+eps);
     Wi(idx) = di;
 end

有没有人知道如何在不使用for-loop的情况下将其放入R中? 非常感谢!

1 个答案:

答案 0 :(得分:2)

似乎Matlab中的cell2mat函数将矩阵矩阵转换为单个矩阵。矩阵矩阵并不是R中常见的数据类型。但是你可以使用

创建一个矩阵
a<-matrix(list(), 2,2)
a[[1,1]]<-matrix(1, nrow=1)
a[[1,2]]<-matrix(2:4, nrow=1)
a[[2,1]]<-matrix(c(5,9), nrow=2)
a[[2,2]]<-matrix(c(6:8, 10:12), nrow=2, byrow=T)

(就像MatLab help page for cel2mat上的例子一样)。该代码的R转换可能是

cell2mat<-function(m)
    do.call(rbind, apply(m, 1, function(x) do.call(cbind,x)))

我们可以测试

cell2mat(a)

#      [,1] [,2] [,3] [,4]
# [1,]    1    2    3    4
# [2,]    5    6    7    8
# [3,]    9   10   11   12

这可能不是最有效的翻译,但它可能是最简单的。