Есть ли способ заменить 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"
Заранее спасибо.