利用 R 的三大法宝:
来达到编写高效的代码的目的.3 |' F, Y1 G5 v7 N% f
这样的代码的特点是可以接受整个向量作为输入,并同时处理向量中的元素.
通过以下几个案例来阐述向量化编程
格式: rep(c(-1, 1), 5000000)
功能:接受某个值/向量以及次数,返回该值/向量的重复执行次数长度的更长的向量
格式: system.time(function(object))
功能:输入一个语句,返回执行该语句所耗费的时间.
可以接受一个含有多个值的向量作为输入,并且同时操作向量中的每一个元素
如何编写向量化代码原则:
程序①——未经向量化
change_symbols <- function(vec){$ f% ]. d( o4 U0 W( \7 v
for(i in 1:length(vec)){
if(vec == "DD"){" O+ c, I/ N0 E3 A
vec <- "joker"# V1 Y4 w8 B/ y+ G
}else if(vec == "C"){5 s* e; x f2 W& K
vec <- "ace": S/ E3 X- |8 @
}else if(vec == "7"){
vec <- "king"' z8 K T* l4 ?
}else if(vec == "B"){' d8 p) j0 c" o: J2 c+ `& B6 x8 I
vec <- "queen"% N6 R- x: u& T' ?8 t( d* [
}else if(vec == "BB"){
vec <- "jack"1 w! m0 B# w5 e7 z/ x
}else if(vec == "BBB"){1 L# i/ c8 D+ C
vec <- "ten"
}else{: }5 G& g- [. Y1 O ^3 m+ M, C: k! f
vec <- "nine": s& X* c+ L& q0 I& i% T
}% J2 ]4 H& M9 F; z
}
vec
}
程序②——向量化
change_vec <- function(vec){
prob <- c("DD" = "joker", "C" = "ace"...)1 O# h/ j! F n
unname(prob[vec])
}
目的:一次性完成对一类情况中的所有元素的操作) g! b; R& u7 V/ q. N' E/ X
案例:
程序①——未经向量化
abs_loop <- function(vec){
for(i in 1:length(vec)){
if(vec < 0){
vec <- -vec V6 ^% P X" _
}, S+ v& U5 ?& X( P, G- S, l
}. |9 [4 {) h1 t: M; {% O
vec
}
程序②——向量化
abs_set <- function(vec){% v/ w* s7 t2 v+ P/ X
negs <- vec < 0
vec[negs] <- vec[negs] * -1
vec
}
未向量化的程序:
if 语句一次只能针对一个元素进行判断,来判断出 vec 中为负数的元素
向量化的程序:( A& s+ a/ D/ Y( N& Y
其中, vec < 0 为逻辑测试,返回一个包含 TRUE, FALSE 逻辑值的向量 negs, 通过逻辑值取子集的方法,得到 vec 中为负数的元素, 即 vec[negs].
在 for 循环之前,定义好一个含有 1000000 个 NA 值的向量., M+ ~% E. N1 a
在 for 循环之中, 对于对一个向量中的元素进行相应的操作.
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |