написать функцию которая на вход получает числовой вектор, а на выходе выдает вектор, i-ая координата которого - это максимальное значение из первых i-элементов вектора на входе желательно - оптимизировать по скорости выполнения
neighbors<-function(v)
{
n<-length(v)
if(n<2) return (v)
for (i in 2:n)
if (v[i]<v[i-1])
v[i]<-v[i-1]
v
}
withMax<-function(v)
{
n<-length(v)
if(n<2) return (v)
max=v[1]
for (i in 2:n)
if (v[i]<max)
v[i]<-max
else
max<-v[i]
v
}
withWhichAndRep<-function(v)
{
n<-length(v)
if(n<2) return (v)
max=v[1]
v1=numeric(0)
# The index of the maximum element
m=which.max(v)
for (i in 1:m)
{
if (v[i]>max)max=v[i]
v1[i]<-max
}
# Merge of vector v1 and vector with repeating of maximum
v1<-c(v1,rep(v[m],n-m))
v1
}
withIfElse<- function(v) {
n<-length(v)
if(n<2) return (v)
max=v[1]
for (i in 2:n)
{
max=ifelse(v[i]>max,v[i],max)
v[i]=max
}
v
}
withV1AndMax<- function(v) {
v1=numeric(0)
for (i in 1:length(v))
{
# Attachment the elements to the vector and calculate of maximum
v1[i]=v[i]
v1[i]=max(v1)
}
v1
}
library(Rcpp)
# without STL and pointers (poiner don't work with numeric)
# NumericVector - special R type (numeric)
cppFunction('
NumericVector vecCpp(NumericVector v) {
int n=v.size();
if(n<2) return v;
int max=v[0];
for(int i=1;i<=n;i++)
if (v[i]<max) v[i]=max;
else max=v[i];
return v;
}
')
# within STL and iterators
cppFunction('
NumericVector vecSTL(NumericVector v) {
if(v.size()<2) return v;
int i=1;
double max = v[0];
NumericVector::iterator it;
for(it = v.begin() + 1; it != v.end(); ++it,i++)
if (*it<max) v[i]=max;
else max=*it;
return v;
}
')
# The random vector of 1000 dimension
set.seed(12345)
v<-sample.int(200, size =1000,replace=T)
v
## [1] 145 176 153 178 92 34 66 102 146 198 7 31 148 1 79 93 78
## [18] 81 36 191 91 66 194 142 129 78 140 109 46 97 159 2 38 137
## [35] 75 73 174 181 124 27 157 86 186 155 52 65 13 9 12 126 193
## [52] 166 64 43 147 100 146 17 88 48 159 52 198 152 196 44 190 30
## [69] 121 190 138 102 75 68 10 124 193 131 103 31 175 103 2 4 29
## [86] 62 166 101 161 13 186 162 16 121 143 103 145 150 20 80 59 124
## [103] 195 124 105 181 128 173 51 44 122 77 152 76 159 182 197 118 2
## [120] 65 112 103 18 137 142 161 189 38 56 155 7 135 163 133 189 175
## [137] 140 38 20 162 105 139 44 126 30 192 199 100 184 75 166 112 160
## [154] 71 42 157 137 87 170 121 149 119 171 163 77 99 199 35 167 80
## [171] 194 38 150 62 76 151 141 185 160 166 34 82 40 52 195 163 70
## [188] 188 33 32 151 178 62 63 197 2 55 160 49 92 118 179 25 103
## [205] 133 154 19 14 112 131 60 140 76 53 189 87 66 107 126 35 22
## [222] 22 19 107 180 143 182 88 94 120 62 115 96 140 148 104 198 184
## [239] 95 77 188 189 182 157 126 136 188 107 68 159 25 192 7 52 176
## [256] 170 4 37 24 96 190 166 163 184 141 17 24 159 200 139 30 64
## [273] 32 200 150 79 111 6 68 172 26 159 20 4 56 83 14 160 102
## [290] 104 142 167 13 68 161 57 163 44 112 4 11 120 142 131 116 136
## [307] 42 48 92 69 81 87 192 45 74 177 106 118 52 174 63 135 124
## [324] 81 81 193 63 4 33 46 78 170 148 135 22 12 193 146 99 177
## [341] 116 139 183 168 103 126 160 189 9 151 137 125 199 128 132 146 118
## [358] 116 7 158 37 34 97 49 69 144 175 51 159 115 107 157 186 125
## [375] 130 87 87 196 62 92 142 163 62 136 157 173 124 38 181 7 158
## [392] 171 161 34 66 40 66 77 102 26 16 95 53 47 120 32 172 48
## [409] 160 16 109 144 9 6 149 155 108 78 94 25 168 54 40 51 78
## [426] 169 197 62 55 125 125 12 150 63 9 114 4 176 106 22 162 162
## [443] 3 137 89 181 79 1 193 194 150 81 84 165 101 140 188 52 107
## [460] 19 107 185 44 173 114 80 121 76 163 59 64 84 156 129 53 63
## [477] 147 156 120 24 49 53 58 107 80 129 29 174 92 180 156 164 200
## [494] 118 94 67 142 152 155 175 42 154 169 187 136 172 16 128 80 150
## [511] 148 75 68 135 65 137 43 50 25 158 153 40 180 120 89 60 61
## [528] 115 187 162 88 72 104 131 138 165 24 184 51 82 53 65 49 108
## [545] 144 108 4 125 121 153 175 89 102 179 76 52 34 18 137 72 14
## [562] 14 114 137 39 54 189 104 149 45 128 126 109 49 50 94 167 47
## [579] 156 105 67 156 48 68 85 140 132 145 33 11 115 23 4 156 54
## [596] 137 45 195 136 157 140 3 101 147 66 165 177 172 91 95 104 33
## [613] 177 41 127 9 75 121 191 43 36 174 94 46 182 195 192 110 197
## [630] 70 76 85 57 14 16 87 198 23 45 45 130 102 146 64 170 102
## [647] 137 189 3 105 165 66 137 124 131 192 47 66 168 30 185 18 138
## [664] 194 128 85 162 53 132 117 129 6 13 197 188 40 139 66 136 15
## [681] 197 26 76 171 166 135 141 177 93 141 89 183 24 12 142 174 1
## [698] 152 157 99 124 72 94 60 15 145 28 156 171 69 72 188 128 68
## [715] 103 88 137 182 36 53 71 7 7 19 123 4 85 17 102 108 149
## [732] 128 125 172 191 125 150 23 79 184 89 14 192 189 137 12 144 66
## [749] 150 189 44 149 176 92 5 54 156 143 198 4 64 51 92 107 129
## [766] 185 60 163 139 39 89 172 164 63 198 79 24 4 68 166 158 76
## [783] 139 122 110 172 72 62 121 66 121 50 148 4 125 173 98 98 17
## [800] 80 147 190 101 8 123 23 32 32 54 57 160 91 94 117 67 152
## [817] 23 188 31 108 34 123 88 150 178 28 106 141 38 11 99 129 126
## [834] 96 36 87 26 138 173 111 140 56 124 104 58 101 117 34 179 100
## [851] 67 191 182 62 45 61 179 124 146 123 42 19 97 162 114 133 23
## [868] 15 131 184 138 40 198 103 163 87 158 4 195 33 131 70 148 83
## [885] 109 146 169 75 178 5 139 33 37 20 3 37 134 62 31 53 153
## [902] 24 170 66 57 11 67 113 169 34 178 35 187 149 88 155 35 68
## [919] 128 68 20 143 79 110 113 56 38 19 91 170 40 130 32 176 37
## [936] 122 4 71 89 119 181 124 98 165 3 183 142 114 160 112 62 68
## [953] 55 47 61 99 100 35 93 68 99 104 90 133 90 103 135 83 16
## [970] 154 117 184 155 187 112 130 113 82 119 183 25 90 161 189 81 72
## [987] 5 149 82 5 118 54 47 107 40 173 92 45 76 27
# The first 30 elements of result vectors
head(vecCpp(v),30)
## [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(vecSTL(v),30)
## [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(cummax(v),30)
## [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(neighbors(v),30)
## [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(withIfElse(v),30)
## [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(withV1AndMax(v),30)
## [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(withWhichAndRep(v),30)
## [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
library(microbenchmark)
compare <- microbenchmark(vecCpp(v),
vecSTL(v),
cummax(v),
neighbors(v),
withIfElse(v),
withV1AndMax(v),
withWhichAndRep(v),
times = 1000)
library(ggplot2)
autoplot(compare)
Winners:
cummax()
vecCpp()
vecSTL()
withWhichAndRep()