Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R矩阵运算_R_Matrix Multiplication - Fatal编程技术网

R矩阵运算

R矩阵运算,r,matrix-multiplication,R,Matrix Multiplication,我有一个矩阵(15000 x 3000)。目标是根据原始矩阵和初始值生成新矩阵。例如,我想实施的标准是: 到目前为止,我的代码就是这样设置的 DF1[1,]=1 for( i in 2:2000 ) { for( j in 1:15000 ) { if(DF[j,i] == 1 && DF1[j-1,i] == 0) DF1[j,i] = 1 else if(DF[j,i] ==

我有一个矩阵(15000 x 3000)。目标是根据原始矩阵和初始值生成新矩阵。例如,我想实施的标准是:

到目前为止,我的代码就是这样设置的

DF1[1,]=1

for( i in 2:2000 ) {
    for( j in 1:15000 ) {

              if(DF[j,i] == 1 && DF1[j-1,i] == 0)
                DF1[j,i] = 1
              else if(DF[j,i] == 0 && DF1[j-1,i] == 1)
                DF1[j,i] = 0
              else DF[j,i,1] = DF1[j-1,i]

    }
}
DF是原始矩阵

DF1是新形成的矩阵

我的问题:还有其他方法吗?更快的方法

由于嵌套循环不能很好地工作,我尝试使用apply,但我不知道如何编写该函数,因为它与两个矩阵相关


一个例子

x <- structure(c(1L, 0L, 0L, NA, NA, 0L, NA, 0L, 1L, 0L, 1L, 0L, 0L, 
NA, 0L, NA, 1L, NA, 1L, 0L, 1L, 0L, 1L, 0L), .Dim = c(4L, 6L), .Dimnames = list(
    NULL, NULL))
x
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1   NA    1    0    1    1
#[2,]    0    0    0   NA   NA    0
#[3,]    0   NA    1    0    1    1
#[4,]   NA    0    0   NA    0    0

函数
f1
使用嵌套循环。(为了解决与
NA
比较导致非逻辑值
NA
的问题,我将
NA
替换为
Inf
) 仔细阅读由循环表示的算法,可以得出备选的
f2

f1 <- function( x, initialValues = 1 )
{
  x[which(is.na(x))] <- Inf
  y <- matrix(NA,nrow(x),ncol(x))
  y[1,] <- initialValues

  for( i in 1:ncol(x) ) { 
    for( j in 2:nrow(x) ) { 
      if(x[j,i] == 1 && y[j-1,i] == 0) { 
        y[j,i] = 1 
      }else{
        if(x[j,i] == 0 && y[j-1,i] == 1) {
          y[j,i] = 0 
        }else{ 
          y[j,i] = y[j-1,i]
        }
      }
    }
  }
  return(y)
}

f2 <- function( x, initialValues = 1 )
{  
  g <- function(v)
  {
    m <- cumsum(!is.na(v))
    v[which(!is.na(v))[m]]
  }

  x[which(!(x %in% 0:1))] <- NA
  x[1,] <- initialValues
  return( apply(x,2,g) )
}
较大的矩阵:

> set.seed(1)

> n <- 200

> m <- 300

> big_x <- matrix(sample(0:10,n*m,replace=TRUE),n,m)

> big_x[sample(1:(n*m),floor((n*m)/3))] <- NA

> microbenchmark( f1(big_x), f2(big_x) )
Unit: milliseconds
      expr       min        lq      mean    median        uq      max neval
 f1(big_x) 360.42174 495.63713 662.54576 772.42981 778.18100 890.0092   100
 f2(big_x)  33.54202  38.65849  62.25661  67.82429  72.42288 188.2729   100

> all(f1(big_x)==f2(big_x))
[1] TRUE
> 
>设置种子(1)
>n m big_xbig_x[样本(1:(n*m),地板((n*m)/3))]微基准(f1(big_x),f2(big_x))
单位:毫秒
expr最小lq平均uq最大neval
f1(big_x)360.42174 495.63713 662.54576 772.42981 778.18100 890.0092 100
f2(大x)33.54202 38.65849 62.25661 67.82429 72.42288 188.2729 100
>全部(f1(大x)=f2(大x))
[1] 真的
> 
甚至更大:

> set.seed(1)

> n <- 800

> m <- 1000

> huge_x <- matrix(sample(0:10,n*m,replace=TRUE),n,m)

> huge_x[sample(1:(n*m),floor((n*m)/3))] <- NA

> microbenchmark( f1(huge_x), f2(huge_x) )
Unit: milliseconds
       expr       min        lq     mean    median       uq       max neval
 f1(huge_x) 4002.4121 7759.2438 8149.821 8466.4698 8950.172 10087.251   100
 f2(huge_x)  311.4259  520.5374  751.874  774.2699 1010.188  1228.504   100

> all(f1(huge_x)==f2(huge_x))
[1] TRUE
> 
>设置种子(1)
>n m巨大的x巨大的x[样本(1:(n*m),地板((n*m)/3))]微基准(f1(巨大的x),f2(巨大的x))
单位:毫秒
expr最小lq平均uq最大neval
f1(巨幅x)4002.4121 7759.2438 8149.821 8466.4698 8950.172 10087.251 100
f2(巨大_x)311.4259520.5374751.874774.26991010.1881228.504100
>全部(f1(大x)=f2(大x))
[1] 真的
> 
问题中提到的15000乘以3000的矩阵:

> library(microbenchmark)

> x <- structure(c(1L, 0L, 0L, NA, NA, 0L, NA, 0L, 1L, 0L, 1L, 0L, 0L, 
+                  NA, 0L, NA, 1L, NA, 1L, 0L, 1L, 0L, 1L, 0L), .Dim = c(4L, 6 .... [TRUNCATED] 

> microbenchmark( f1(x), f2(x) )
Unit: microseconds
  expr     min       lq     mean   median      uq     max neval
 f1(x) 433.864 461.2645 482.9120 471.6805 480.059 920.716   100
 f2(x) 379.518 387.6700 402.9235 391.7465 414.617 620.453   100

> all(f1(x)==f2(x))
[1] TRUE
> set.seed(1)

> n <- 15000

> m <- 3000

> x_15k.3k <- matrix(sample(0:1,n*m,replace=TRUE),n,m)

> x_15k.3k[sample(1:(n*m),floor((n*m)/3))] <- NA

> microbenchmark( f1(x_15k.3k), f2(x_15k.3k), times=1 )
Unit: seconds
         expr       min        lq      mean    median        uq       max
 f1(x_15k.3k) 389.47262 389.47262 389.47262 389.47262 389.47262 389.47262
 f2(x_15k.3k)  19.97606  19.97606  19.97606  19.97606  19.97606  19.97606
 neval
     1
     1

> all(f1(x_15k.3k)==f2(x_15k.3k))
[1] TRUE
> 
>设置种子(1)
>n m x_15k.3k x_15k.3k[样品(1:(n*m),地板((n*m)/3))]微基准(f1(x_15k.3k),f2(x_15k.3k),时间=1)
单位:秒
expr最小lq平均uq最大中值
f1(x_15k.3k)389.47262 389.47262 389.47262 389.47262 389.47262 389.47262 389.47262 389.47262
f2(x_15k.3k)19.97606 19.97606 19.97606 19.97606 19.97606 19.97606 19.97606 19.97606
内瓦尔
1.
1.
>全部(f1(x_15k.3k)=f2(x_15k.3k))
[1] 真的
> 

DF[j,i,1]
3维?不,应该是DF[j,i]winnie,如果你能用输入矩阵和预期结果添加一个小例子,那就太好了。谢谢你举个例子。你能检查一下我是否把它复制到你的问题上了吗。请注意,我将索引
y[j,i,1]
更改为
y[j,i]
-对吗?您收到的错误消息是什么?您为
x
y
显示的代码末尾缺少一个
}
。您尚未初始化
y
。矩阵
x
包含
NA
;你不能用数字来测试等式。当
x
中有条目
NA
时,
y
应该是什么?你应该使用内置的
is.na
。你真聪明!!!谢谢你热情的回复。但是我理解你的算法有点困难,恩,因为我是R的新手,你能推荐我一本学习基本算法的书吗(中文更好,我不擅长英语)?我非常感谢你。对不起,我不知道这样的书。我通过解释函数
g
来增强我的答案。此外,我还考虑了为第一行选择任意值的可能性。它们不一定都是1。是的,我也注意到结果与初始值无关。
> set.seed(1)

> n <- 15000

> m <- 3000

> x_15k.3k <- matrix(sample(0:1,n*m,replace=TRUE),n,m)

> x_15k.3k[sample(1:(n*m),floor((n*m)/3))] <- NA

> microbenchmark( f1(x_15k.3k), f2(x_15k.3k), times=1 )
Unit: seconds
         expr       min        lq      mean    median        uq       max
 f1(x_15k.3k) 389.47262 389.47262 389.47262 389.47262 389.47262 389.47262
 f2(x_15k.3k)  19.97606  19.97606  19.97606  19.97606  19.97606  19.97606
 neval
     1
     1

> all(f1(x_15k.3k)==f2(x_15k.3k))
[1] TRUE
>