【问题标题】:get lower triangular matrix with for loop without built in function in R在R中没有内置函数的情况下使用for循环获得下三角矩阵
【发布时间】:2019-03-22 20:17:12
【问题描述】:

我需要从指定的矩阵中创建一个下三角矩阵,而不使用 lower.try 函数,特别是使用嵌套的 for 循环。 我已经走到这一步了……

d <- 6
m <- matrix(1:(d*d), d, d)
for(i in 2:nrow(m)) {
  for (j in 1:col(m)) {
    #...skipped code
  }
}

请帮忙!

【问题讨论】:

  • 什么意思“得到下三角矩阵”?如果您的预期输出与lower.tri 完全相同,那么您需要先创建一个空矩阵。如果您的预期输出不同,可能是矩阵下三角形值的向量,那么它将是一个向量。请具体说明此特定 6x6 矩阵的预期输出。这听起来像是家庭作业,对吗?如果是这样也没关系,但老实说这是一种很好的礼仪。
  • 我的意思是我需要用零替换对角线以下的所有值。对不起,我是编码新手,这是我第一次发布编码问题,因此不知道礼仪。谢谢你告诉我
  • 如果i是你的行,j是你的列,那么你想替换i &gt; j时的值,对吧?这应该标记出您 在对角线下方 的位置。有了它,创建一个 if 语句来检查它,如果为真,则将 0 分配给 m[i,j]。 (即使忘记我们已经创建了lower.tri,也有更好/更快的方法可以做到这一点,但我知道你必须使用两个for 循环。)

标签: r for-loop matrix


【解决方案1】:

您应该尝试执行高斯消除的步骤,但不是消除第 i 个步骤中的第 i 个列元素,您应该尝试消除最后一个元素。

mymat <- matrix(sample(x = c(1:10),replace = T,size = 25), ncol = 5, nrow = 5, byrow = T)  

#iterating from the last row, to the first
for(j in nrow(mymat):1){
  if(j>1){
    #iterating from first, to the one before the current
    for(i in 1:(j-1)){
      #subtract the two rows but with the corresponding multiplier to eliminate the column's variables
      multiplier <- mymat[i,j]/mymat[j,j] 
      mymat[i,] <- mymat[i,]-multiplier*mymat[j,]
    }
  }
  #to get 1s in the diagonal line
  mymat[j,] <- mymat[j,]/mymat[j,j]
}

如果你不想在对角线上得到 1:

for(j in nrow(mymat):1){
  if(j>1){
    for(i in 1:(j-1)){
      multiplier <- mymat[i,j]/mymat[j,j] 
      mymat[i,] <- mymat[i,]-multiplier*mymat[j,]
    }
  }
  mymat[j,] <- mymat[j,]/mymat[j,j]
}

【讨论】:

    【解决方案2】:

    我能够通过以下代码得到答案,但我希望在没有 if 语句的情况下也能得到相同的输出

    d <- 6
    m <- matrix(1:(d*d), d, d)
    for(i in 2:nrow(m)) {
    for (j in 1:ncol(m)) {
        if (m[i,j] < diag(m)[i]) {
        m[i,j] <-0
        }
      } 
    } m
    
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1    7   13   19   25   31
    [2,]    0    8   14   20   26   32
    [3,]    0    0   15   21   27   33
    [4,]    0    0    0   22   28   34
    [5,]    0    0    0    0   29   35
    [6,]    0    0    0    0    0   36
    

    【讨论】:

      【解决方案3】:

      由于我还不能添加评论,我将把它作为另一个答案发布。您可以在没有 if 语句的情况下执行以下操作:

      d <- 6
      m <- matrix(1:(d*d), d, d)
      for(i in c(2:dim(m)[1])) # from 2 to the number of rows
        for(j in c(1:(i-1)))   # from 1 to the number of the current iteration - 1
          m[i,j] <- 0
      
           [,1] [,2] [,3] [,4] [,5] [,6]
      [1,]    1    7   13   19   25   31
      [2,]    0    8   14   20   26   32
      [3,]    0    0   15   21   27   33
      [4,]    0    0    0   22   28   34
      [5,]    0    0    0    0   29   35
      [6,]    0    0    0    0    0   36
      

      【讨论】:

        【解决方案4】:
        d <- 6
        m <- matrix(1:(d*d), d, d)
        
        for (j in 1:(d-1)) {
          for (i in (j+1):d) {
            m[i,j] = 0
          }
        }
        

        Val A 的回答给了我一些见解。我只是修复小错误。现在您不需要 if 语句来完成这项工作。

        【讨论】:

          猜你喜欢
          • 2014-02-19
          • 1970-01-01
          • 2014-11-16
          • 2019-12-06
          • 1970-01-01
          • 1970-01-01
          • 2014-05-01
          • 2016-10-31
          • 2018-09-30
          相关资源
          最近更新 更多