我对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中? 非常感谢!
答案 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
这可能不是最有效的翻译,但它可能是最简单的。