получить нижнюю треугольную матрицу с циклом for без встроенной функции в R - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно создать нижнюю треугольную матрицу из указанной матрицы, без использования функции 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
  }
}

Пожалуйста, помогите!

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Мне удалось получить ответ с помощью следующего кода, но хотелось бы получить тот же вывод без оператора 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
0 голосов
/ 06 марта 2019

Поскольку я пока не могу добавить комментарий, я собираюсь опубликовать это как другой ответ.Вы можете сделать следующее без оператора 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
0 голосов
/ 18 октября 2018

Вы должны попытаться реализовать шаги гауссовского исключения, но вместо того, чтобы удалять элементы 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]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...