献丑了。期待看到更好的方案。
如果是问高维数据如何存储,我建议用列表:
A = list(1:3, 4:6, 7:9) B = list(11:13, 14:16, 16:19) C = list(21:23, 24:26, 27:29) T = list(A, B, C) > T [[1]] [[1]][[1]] [1] 1 2 3 [[1]][[2]] [1] 4 5 6 [[1]][[3]] [1] 7 8 9 [[2]] [[2]][[1]] [1] 11 12 13 [[2]][[2]] [1] 14 15 16 [[2]][[3]] [1] 17 18 19 [[3]] [[3]][[1]] [1] 21 22 23 [[3]][[2]] [1] 24 25 26 [[3]][[3]] [1] 27 28 29
这样我们就得到一个 的立方阵,至于求和那就很简单了:
> sum(as.vector(unlist(T))) [1] 405
可以验证
S = 0 for(i in 1:3)for(j in 1:3)for(k in 1:3) S = S + T[[i]][[j]][[k]] > S [1] 405
如何将多重求和转化为如下的形式,
这需要将求和指标 按某种顺序不重不漏地排列。
#可重复元素的树形图,以矩阵形式列出 CC<-function(n,m) { M = n^m; N = m*M C = rep(0, N); C = matrix(C, ncol = m) a = 1:n for(i in m:1) { B = c() for(j in a) {copy = n^(m - i); b = rep(j, copy); B = c(B, b)} B = rep(B, M/(n*copy)) C[,i] = t(B) } C } #例:3 表示每层求和次数,2 表示求和重数 > CC(3,2) [,1] [,2] [1,] 1 1 [2,] 1 2 [3,] 1 3 [4,] 2 1 [5,] 2 2 [6,] 2 3 [7,] 3 1 [8,] 3 2 [9,] 3 3
这样一来,求和指标就完美地排列下来,然后在构造计算 的函数时,定义自变量为指标向量 的函数:
P <- function(I) expr
于是,无论是求几重的求和,都可以用 重循环就搞定了(尽管是形式上的):
# n 表示每层求和次数,m 表示求和重数 S = 0; L = n^m; C = CC(n, m) for(i in L){ I = C[i, ]; S = S + P(I) } S
我以前写过不可重复元素的树形图的函数:
#树形图,n 为 size, m 为初始数 #树形图采用矩阵形式表示 #这里本来直接定义阶乘函数就行了,但不知道当时抽了什么筋,非要定义成 gamma 函数 gamma <- function(n) { g = 1 for(i in 2:(n-1)){ g = g*i } g } #在Tree的基础上转化为矩阵形式 TT<-function(n,m) { M = gamma(n); N = n*M TT = rep(0,N); TT = matrix(TT,ncol = n); TT[,1] = m a = 1:n T = list(c(m),a[which(a != m)]) TT[,2] = T[[2]]; TT[,2] = sort(TT[,2]) for(i in a[-(1:2)]) { p = n - i + 2 T[[i]] = 0 q = length(T[[i - 1]])/p for(j in 1:q) { t = T[[i-1]][((j-1)*p+1):(j*p)] r = length(t) for(k in 1:r) T[[i]] = c(T[[i]],t[which(t != t[k])]) } T[[i]] = T[[i]][-1] L = length(T[[i]]) TT[,i] = as.vector(t(matrix(rep(T[[i]],M/L),L))) } TT } #例: TT(4,4) 表示以 4 为起始,1、2、3 作为分叉的树形图 > TT(4,4) [,1] [,2] [,3] [,4] [1,] 4 1 2 3 [2,] 4 1 3 2 [3,] 4 2 1 3 [4,] 4 2 3 1 [5,] 4 3 1 2 [6,] 4 3 2 1
如果去掉第一列,
> TT(4,4)[,-1] [,1] [,2] [,3] [1,] 1 2 3 [2,] 1 3 2 [3,] 2 1 3 [4,] 2 3 1 [5,] 3 1 2 [6,] 3 2 1
就可以得到 的全排列。