使用强制矩阵中的数据更新矩阵
Updating Matrix Using Data From Coerced Matrix
这是我正在使用的代码:
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.5
不会改变,直到 R*(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
如您所见,none 个元素为零。这意味着表达式
R*(mat==0)==0
等同于
mat!=0
因为乘以 R
不能将非零值变为零,也不能将零变为非零值。
如果您仍想在 R
条件下参数化 ifelse()
,可能是因为您可能想要 运行 此代码用于 R
的不同值,可以包含零,那么它应该被重写为
R==0|mat!=0
其次,您的代码在状态变量 EnvTest$Orig
的维数方面存在一些可疑模式。您将其初始化为单元素向量 (548453.5),但在 FuncTest()
的第一个 运行 上,它立即被三元素向量覆盖,其中初始标量循环 3 次以容纳三个元素-元素向量 P[,pp]
和 R[,pp]
。从那时起,它就永远是一个三元素向量。在 FuncTest2()
(第一次尝试)中,由于 mat
和 R
是 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
但是,此结果与您在第二行中的预期输出不完全匹配,我不确定为什么。
这是我正在使用的代码:
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.5
不会改变,直到 R*(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
如您所见,none 个元素为零。这意味着表达式
R*(mat==0)==0
等同于
mat!=0
因为乘以 R
不能将非零值变为零,也不能将零变为非零值。
如果您仍想在 R
条件下参数化 ifelse()
,可能是因为您可能想要 运行 此代码用于 R
的不同值,可以包含零,那么它应该被重写为
R==0|mat!=0
其次,您的代码在状态变量 EnvTest$Orig
的维数方面存在一些可疑模式。您将其初始化为单元素向量 (548453.5),但在 FuncTest()
的第一个 运行 上,它立即被三元素向量覆盖,其中初始标量循环 3 次以容纳三个元素-元素向量 P[,pp]
和 R[,pp]
。从那时起,它就永远是一个三元素向量。在 FuncTest2()
(第一次尝试)中,由于 mat
和 R
是 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
但是,此结果与您在第二行中的预期输出不完全匹配,我不确定为什么。