首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于创建对称矩阵的循环

用于创建对称矩阵的循环
EN

Stack Overflow用户
提问于 2017-04-06 10:49:42
回答 3查看 715关注 0票数 2

我想通过减少创建对称矩阵的迭代来减少时间和内存的使用(我以前使用过外部的,但它消耗的内存比我多),也就是说sol[i, j]sol[j, i]是相同的。

到目前为止我的代码是:

代码语言:javascript
复制
# Prepare input
subss <- list(a = c(1, 2, 4), b = c(1, 2, 3), c = c(4, 5))
A <- matrix(runif(25), ncol = 5, nrow = 5)
# Pre allocate memory
sol <- matrix(nrow = length(subss), ncol = length(subss), 
          dimnames = list(names(subss), names(subss))) 
x <- 0
for (i in seq_along(subss)) {
    # Omit for the subsets I already calculated ?
    for (j in seq_along(subss)) {
        x <- x + 1
        message(x)

        # The function I use here might result in a NA
        sol[i, j] <- mean(A[subss[[i]], subss[[j]]]) 
        sol[j, i] <- sol[i, j] # Will overwrite when it shouldn't
    }
}

将使用9次迭代,如何避免它们并且只执行6次迭代?

我需要计算对称值,这样this question就不适用了。而且,这个other one也不能工作,因为可能有许多组合,而且在某些时候它不能在内存中分配向量。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-06 11:14:34

for循环通常比outer慢。尝试字节编译循环或在Rcpp中实现它。

代码语言:javascript
复制
subss <- list(a = c(1, 2, 4), b = c(1, 2, 3), c = c(4, 5))
set.seed(42)
A <- matrix(runif(25), ncol = 5, nrow = 5)

#all combinations of indices
ij <- combn(seq_along(subss), 2)

#add all i = j
ij <- matrix(c(ij, rep(seq_along(subss), each = 2)), nrow = 2)

#preallocate
res <- numeric(ncol(ij))

#only one loop
for (k in seq_len(ncol(ij))) {

    message(k)

    res[k] <- mean(A[subss[[ij[1, k]]], subss[[ij[2, k]]]]) 
}
#1
#2
#3
#4
#5
#6

#create symmetric sparse matrix    
library(Matrix)
sol <- sparseMatrix(i = ij[1,], j = ij[2,],
                    x = res, dims = rep(length(subss), 2), 
                    symmetric = TRUE, index1 = TRUE)
#3 x 3 sparse Matrix of class "dsCMatrix"
#                                  
#[1,] 0.7764715 0.6696987 0.7304413
#[2,] 0.6696987 0.6266553 0.6778936
#[3,] 0.7304413 0.6778936 0.5161089
票数 1
EN

Stack Overflow用户

发布于 2017-04-06 12:04:06

我找到了一种简单的循环方式:

代码语言:javascript
复制
x <- 0
for (i in seq_along(subss)) {
    for (j in seq_len(i)) { # or for (j in 1:i) as proposed below
        x <- x + 1
        message(x)

        sol[i, j] <- mean(A[subss[[i]], subss[[j]]]) 
        sol[j, i] <- sol[i, j]
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-04-06 14:40:00

代码语言:javascript
复制
for (i in 1:length(subss)) {
  for (j in 1:i) {
    message(i, ' ', j, ' - ', mean(A[subss[[i]], subss[[j]]]) ) # Check iterations and value
    sol2[i, j] <- sol2[j, i] <- mean(A[subss[[i]], subss[[j]]]) 
  }
}

我检查了您的脚本值,并且不对称:

代码语言:javascript
复制
1 1 - 0.635455905252861
1 2 - 0.638608284398086
1 3 - 0.488700995299344
2 1 - 0.568414432255344
2 2 - 0.602851431118324
2 3 - 0.516099992596234
3 1 - 0.595461705311512
3 2 - 0.656920690399905
3 3 - 0.460815121419728

地雷值(与@Llopis相同):

代码语言:javascript
复制
1 2 - 0.638608284398086
1 3 - 0.488700995299344
2 2 - 0.602851431118324
2 3 - 0.516099992596234
3 2 - 0.656920690399905
3 3 - 0.460815121419728
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43253007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档