r - 使用强制矩阵中的数据更新矩阵

标签 r matrix binary

这是我正在使用的代码:

  y <- c(0,5,10)
n <- 9 

R <- t(c(2.05, 2.05, 2.05, 2.55, 2.55, 2.55, 2.95, 2.95, 2.95))
R <- (replicate(3,R))
R <- (matrix(R, nrow=3))
R <- t(apply(R,1,sort))

mat <- t(sapply(y, function(test) pmax(seq(test, (test-n+1), -1), 0) ))
mat




P <- replicate(ncol(R),(c(6447.88,6447.88,6447.88)))

EnvTest <- new.env()
EnvTest$Orig <- 548453.5

FuncTest <- function(pp){
  EnvTest$Orig <- EnvTest$Orig-(P[,pp]-EnvTest$Orig*R[,pp]/1200)
  return(EnvTest$Orig)
}

Test<- rbind(EnvTest$Orig,
             do.call(rbind,lapply(1:9, FuncTest)))
x <- t(Test)
x

这会产生:

     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]    [,10]
[1,] 548453.5 542942.6 537422.2 531892.4 526574.8 521245.9 515905.7 510726.1 505533.7 500328.6
[2,] 548453.5 542942.6 537422.2 531892.4 526574.8 521245.9 515905.7 510726.1 505533.7 500328.6
[3,] 548453.5 542942.6 537422.2 531892.4 526574.8 521245.9 515905.7 510726.1 505533.7 500328.6

这就是我告诉该函数要做的,这是正确的。但现在我想使用矩阵 R*(mat==0) 中的一些信息这是:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 2.05 2.05 2.05 2.55 2.55 2.55 2.95 2.95 2.95
[2,] 0.00 0.00 0.00 0.00 0.00 2.55 2.95 2.95 2.95
[3,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

所以我试着做这样的事情......

 FuncTest2 <- function(pp){
          EnvTest$Orig <- ifelse(R*(mat==0)==0,EnvTest$Orig,EnvTest$Orig-(P[,pp]-EnvTest$Orig*R[,pp]/1200))
                 return(EnvTest$Orig)
        }
        Test2<- rbind(EnvTest$Orig,
                     do.call(rbind,lapply(1:9, FuncTest2)))
        x2 <- t(Test2)
        x2

但这并没有产生预期的结果:

      [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]    [,10]
[1,] 548453.5 542942.6 537422.2 531892.4 526574.8 521245.9 515905.7 510726.1 505533.7 500328.6
[2,] 548453.5 548453.5 548453.5 548453.5 548453.5 543171.1 538058.5 532933.3 527795.5 522645.1
[3,] 548453.5 548453.5 548453.5 548453.5  548453.5 548453.5 548453.5 548453.5  548453.5 548453.5 

所以基本上如果 R*(mat==0) = 0 那么 EnvTest$Orig <- 548453.5R*(mat==0) 之前不会改变EnvTest$Orig 大于零确实更新。

另一个尝试

我也尝试过执行以下操作,但没有成功,但我认为按照这些思路进行的一些操作会卓有成效。

    maybe <- R*(mat==0)
    FuncTest2 <- function(pp, maybe){
        EnvTest$Orig <- if(maybe == 0) (EnvTest$Orig-0) else
        (EnvTest$Orig-(P[,pp]-EnvTest$Orig*R[,pp]/1200))
      return(EnvTest$Orig)
    }

Test2<- rbind(EnvTest$Orig,
              do.call(rbind,lapply(1:9, FuncTest2)))
x2 <- t(Test2)
x2

最佳答案

首先,关于你的FuncTest()FuncTest2()计算,R是一个常量,因为它在那些函数调用期间或周围的数据操作中没有被修改(指的是 do.call()/rbind()/t() 东西)。这是 R :

R;
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,] 2.05 2.05 2.05 2.55 2.55 2.55 2.95 2.95 2.95
## [2,] 2.05 2.05 2.05 2.55 2.55 2.55 2.95 2.95 2.95
## [3,] 2.05 2.05 2.05 2.55 2.55 2.55 2.95 2.95 2.95

如您所见,它的所有元素都不为零。这意味着表达式

R*(mat==0)==0

相当于

mat!=0

因为乘以 R不能将非零值变为零,也不能将零变为非零值。

如果您仍想参数化 ifelse()有条件的 R ,也许是因为您可能希望针对 R 的不同值运行此代码可以包含零,那么它应该被重写为

R==0|mat!=0

其次,您的代码在状态变量 EnvTest$Orig 的维数方面有点可疑。 .您将其初始化为单元素向量 (548453.5),但在第一次运行 FuncTest() 时它立即被三元素向量覆盖,其中初始标量被循环 3 次以容纳三元素向量 P[,pp]R[,pp] .从那时起,它就永远是一个三元素向量。在 FuncTest2() (第一次尝试),因为 matR是 3x9 矩阵,ifelse() 的 true 和 false 参数矢量化三元将循环覆盖该维度,然后 EnvTest$Orig将被生成的 3x9 矩阵覆盖。从那时起,它就永远是一个 3x9 矩阵。

您可能应该仔细考虑您想要 EnvTest$Orig 的维度是什么?并从头到尾坚持这一点。从您的预期输出来看,您似乎希望它是长度为 3 的向量,因此您应该在 ifelse() 中索引矩阵。有条件的:

FuncTest2 <- function(pp) {
    EnvTest$Orig <- ifelse(R[,pp]==0|mat[,pp]!=0,EnvTest$Orig,EnvTest$Orig-(P[,pp]-EnvTest$Orig*R[,pp]/1200));
    return(EnvTest$Orig);
};
EnvTest$Orig <- 548453.5;
Test2 <- rbind(EnvTest$Orig,do.call(rbind,lapply(1:9,FuncTest2)));
x2 <- t(Test2);
x2;
##          [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]    [,10]
## [1,] 548453.5 542942.6 537422.2 531892.4 526574.8 521245.9 515905.7 510726.1 505533.7 500328.6
## [2,] 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 543171.1 538058.5 532933.3 527795.6
## [3,] 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5 548453.5

但是,此结果与您在第二行中的预期输出不完全匹配,我不确定为什么。

关于r - 使用强制矩阵中的数据更新矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661369/

相关文章:

matlab - Matlab/Octave 是否支持对矩阵切片的操作?

c - 打印此二进制代码...向后。在 C

python - 打开bin文件并将ascii转换为hex

c++ - 二进制文件解释

r - 为什么我们在 RcppArmadillo 上同时使用 "include"和 "depends"?

r - 如何为 S3 对象创建赋值方法?

MLB 球队按年获胜的 R 多线图

python - 有没有简单的方法来旋转矩阵/数组的值?

r - 创建一个由 1 和零组成的矩阵以屏蔽 R 中的 Rayleigh-Tyndall 线

r - 如何处理 “write.xlsx”错误: arguments imply differing number of rows