如何通过在每次迭代中保留原始矩阵来在for循环中添加常量?

时间:2017-10-26 07:54:12

标签: r

例如, X< - 矩阵(C(1,2,3,4),2,2)

1 2

3 4

我想像这样分别向矩阵的每个元素添加常量“c”。

迭代1

1 + c 2

3 4

迭代2

1 2 + c

3 4

迭代3

1 2

3 + c 4

迭代4

1 2

3 4 + c

我尝试了以下R代码,但在执行第二次迭代时保留了更新后的值。

x= matrix of order nxm

for(i in 1:r)

{

for(j in 1:c)

{

x[i,j]=x[i,j]+c

print(x)

}

} 

在此代码中,值会更新并打印每次迭代的更新值。

请帮帮我...先谢谢。

2 个答案:

答案 0 :(得分:0)

您只需制作矩阵的副本:

x_safely_stored <- matrix of order nxm

for(i in 1:r) {

  for(j in 1:c) {

    x <- x_safely_stored
    x[i,j]=x[i,j]+c

    print(x)

  }

} 

答案 1 :(得分:0)

R更喜欢数组操作。

任何矩阵x只是其条目的数组,逐列布局。您可以将常量c连续添加到第一个,第二个,第三个,...条目x 的副本,以便原始x保持不变。通过构造与x相同长度的数组来完成此操作,除了c之外的所有零条目都在所需位置。本文末尾显示的代码通过连接一堆零c和更多零来实现此目的,以便c出现在i位置:

c(rep(0,i-1), cnst, rep(0,n-i)

如果您使用i = 1,2,3等循环,结果将在x的每一列向下移动,从左向右移动。要按照问题中显示的顺序执行操作,这些操作贯穿每一行,从上到下移动,只需将过程应用于x的转置并转置输出。

即使对于大型矩阵,添加整个阵列的方法在我的系统上至少比将c添加到i副本的x位置快两倍。

以下是一般程序的R代码。它适用于任何非空矩阵x。注意:输出包含length(x) x个副本,因此可能非常大。在这个例子中 - 在我的系统上运行大约需要一秒钟 - x有10,000个条目,因此输出有100,000,000个条目。您可能想先在较小的矩阵上测试它!

x <- matrix(1:(100^2), 100) # Any nonempty matrix
cnst <- 1                   # Value to add successively to each term in `x`
#
# The algorithm begins here.
#
n <- length(x)
lapply(1:n, function(i) matrix(as.vector(x)+c(rep(0,i-1),cnst,rep(0,n-i)), nrow(x)))