Заменить для цикла - R Script - PullRequest
0 голосов
/ 29 июня 2018

Есть ли способ заменить For loop в приведенном ниже коде функцией семейства Apply или представить ее любым другим способом, чтобы ускорить выполнение кода:

line = strsplit(textFileContent, " ")
for(i in 2:n){ #looping from 2nd line to nth line of an input txt file

  a = as.numeric(line[[i]][1]) #starting index in a matrix
  b = as.numeric(line[[i]][2]) #ending index in a matrix
  k = as.numeric(line[[i]][3]) #a number

  mat[1,a:b] = mat[1,a:b] + k
  #mat is a matrix of 5 zeros.
  #mat = [0, 0, 0, 0, 0]. 
  #Each time a value (k) will be added to all the elements between starting and ending index
}

EDIT

Пример ввода (textFileContent):

5 3

1 2 100

2 5 100

3 4 100

Здесь 1-я строка ввода содержит 2 числа, разделенных пробелами. 1-е число говорит о том, что матрица mat изначально будет содержать 5 нулей. 2-й номер говорит, сколько строк следует за первой строкой. В приведенном выше коде это принимается как n.

Следующие строки содержат 3 числа, разделенных пробелами. 1-й a, 2-й b и 3-й k.

N.B .: Значения a, b, k, n и 1-го числа 1-й строки могут различаться.

Выход:

[100, 200, 200, 200, 100]

Модифицированный код

filepath = "C:\\textFileContent.text"
con = file(filepath, "r")
inp1 = readLines(con, n = -1, warn = FALSE)

line = strsplit(inp1, " ")

matadd<- function(line) {
  a<-as.numeric(line[1])
  b<-as.numeric(line[2])
  k<-as.numeric(line[3])
  mat[1,a:b]<<-mat[1,a:b]+k
}
mat<-matrix(0,nrow=1,ncol=as.numeric(line[[1]][1]))
temp<-sapply(line[2:(as.numeric(line[[1]][2])+1)],matadd)
cat(apply(mat, 1, max))
close(con)

С приведенным выше примером ввода line выглядит следующим образом:

> line
[[1]]
[1] "5" "3"

[[2]]
[1] "1"   "2"   "100"

[[3]]
[1] "2"   "5"   "100"

[[4]]
[1] "3"   "4"   "100"

Заранее спасибо.

1 Ответ

0 голосов
/ 29 июня 2018

ОК, это предположение, но если я правильно получил ваш запрос и вашу структуру данных, это должно сработать:

matadd<- function(line) {
  a<-as.numeric(line[1])
  b<-as.numeric(line[2])
  k<-as.numeric(line[3])
  mat[1,a:b]<<-mat[1,a:b]+k
}
# Create the matrix with all zeros
mat<-matrix(0,nrow=1,ncol=as.numeric(line[[1]][1]))
# sapply the function on rows 2 thru end of the list
sapply(line[2:(as.numeric(line[[1]][2])+1)],matadd)

на самом деле я мог бы просто использовать length списка, если подумать ...

Например, с line<-list(c(5,2),c(2,3,5),c(1,4,2)) это результат:

мат

      [,1] [,2] [,3] [,4] [,5] 

 [1,]   2    7    7    2    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...