在r中减去两个矩阵

时间:2016-02-17 20:38:34

标签: r matrix

我创建了两个矩阵如下:

    A = c(1,2,3)
    B = c(2,4,6)
    c = as.matrix(c(3,6,9))

    z = as.matrix(cbind(A, B))

现在我想取矩阵c并逐行减去它,例如1-3 = -2& 2-3 = -1 要好好理解R编程,我想创建一个for循环。请你所有的答案都应该改善我的循环。

 for (i in 1:nrow(z))# for the rows in matrix z
  for (j in 1:nrow(c)) # for the rows in matrix c 
     {
      sub = matrix(NA, 3,2) # make a placeholder 
      sub [i,]= z[i,]-c[j,] # i am not sure whether this right
      return((sub))
   }

我收到以下错误:

    Error: no function to return from, jumping to top level

我相信我的for循环是错误的,任何人都可以提供帮助。目的是了解有关R编程的更多信息。感谢

4 个答案:

答案 0 :(得分:7)

这是sweep的好例子:

sweep(z, 1, c)
#      A  B
#[1,] -2 -1
#[2,] -4 -2
#[3,] -6 -3

答案 1 :(得分:3)

如果以这种方式编写循环:

attendance_id

它会毫无错误地结束,但你会得到:

sub = matrix(NA, 3,2) # make a placeholder 
for (i in 1:nrow(z))# for the rows in matrix z
  for (j in 1:nrow(c)) # for the rows in matrix c 
  {
    sub [i,]= z[i,]-c[j,] # i am not sure whether this right
  }
sub

这不是您所期望的...因为最后一个j总是3,所以您将 [,1] [,2] [1,] -8 -7 [2,] -7 -5 [3,] -6 -3 替换为sub[i,] z[i,]-c[3,]

现在,如果你用以下代码替换循环:

z[i,]-9

然后你会:

for (i in 1:nrow(z)) #(nrow(z)==nrow(c))
  {
    sub [i,]= z[i,]-c[i,]
  }

答案 2 :(得分:2)

虽然不推荐,但这将有效

 sub = matrix(NA, 3,2)
 for (i in 1:nrow(z)) {
     sub[i,]=z[i,]-c[i,1]
 }

你不需要第二个循环,c也是一个列矩阵。

答案 3 :(得分:2)

你也可以创建一个矩阵,其中两列都由c

给出
z - cbind(c, c)
##       A  B
## [1,] -2 -1
## [2,] -4 -2
## [3,] -6 -3

对于具有多列的矩阵,这不是一个方便的解决方案。您可以将cbinddo.call一起使用,以获得更大的灵活性:

z - do.call(cbind, rep(list(c), 2))

有必要将c放入列表中。否则,rep(...)将返回单个向量而不是列矩阵列表:

rep(c, 2)
## [1] 3 6 9 3 6 9
rep(list(c), 2)
## [[1]]
##      [,1]
## [1,]    3
## [2,]    6
## [3,]    9
## 
## [[2]]
##      [,1]
## [1,]    3
## [2,]    6
## [3,]    9