创建一个(半)规则序列 - 变化间隔的规则速率
Creating a (half-) regular sequence - a regular rate of varying intervals
我想在 R 中创建一种嵌套的规则序列。它遵循重复模式,但值之间没有一致的间隔。它是:
8, 9, 10, 11, 12, 13, 17, 18, 19, 20, 21, 22, 26, 27, 28, ....
所以 6 个数字,间隔为 1,然后间隔为 3,然后再次相同。我希望一直到 200 左右,理想情况下能够指定该终点。
我尝试过使用 rep
和 seq
,但不知道如何将 定期变化 间隔长度放入任一函数中。
我开始绘制它并考虑根据长度创建一个阶梯函数...它不会那么难 - 我不知道的 trick/magic 包是什么??
我的第一次尝试是使用 for 循环,但请记住,与内置函数相比,它们速度较慢。但是因为你只想 "count" 到 200,它应该足够快了。
for(i=1:199) {
if( mod(i, 7) != 0) {
result[i+1] = result[i] + 1;
} else {
result[i+1] = result[i] + 3;
}
}
注意:回答时我的电脑上没有 Matlab,因此上面的代码未经测试,但我希望你能理解。
无需进行任何数学运算来计算出有多少组等,我们就可以过度生成。
定义术语,我会说你有一组序列,每组 6 个元素。我们将从 100 个小组开始,以确保我们一定 超过 200 个门槛。
n_per_group = 6
n_groups = 100
# first generate a regular sequence, with no adjustments
x = seq(from = 8, length.out = n_per_group * n_groups)
# then calculate an adjustment to add
# as you say, the interval is 3 (well, 3 more than the usual 1)
adjustment = rep(0:(n_groups - 1), each = n_per_group) * 3
# if your prefer modular arithmetic, this is equivalent
# adjustment = (seq_along(x) %/% 6) * 3
# then we just add
x = x + adjustment
# and subset down to the desired result
x = x[x <= 200]
x
# [1] 8 9 10 11 12 13 17 18 19 20 21 22 26 27 28 29 30
# [18] 31 35 36 37 38 39 40 44 45 46 47 48 49 53 54 55 56
# [35] 57 58 62 63 64 65 66 67 71 72 73 74 75 76 80 81 82
# [52] 83 84 85 89 90 91 92 93 94 98 99 100 101 102 103 107 108
# [69] 109 110 111 112 116 117 118 119 120 121 125 126 127 128 129 130 134
# [86] 135 136 137 138 139 143 144 145 146 147 148 152 153 154 155 156 157
#[103] 161 162 163 164 165 166 170 171 172 173 174 175 179 180 181 182 183
#[120] 184 188 189 190 191 192 193 197 198 199 200
序列中连续值之间的差异由 diffs
给出,因此取其中的 cumsum
。要使其达到约 200,请使用指示的重复值,其中 1+1+1+1+1+4 = 9.
diffs <- c(8, rep(c(1, 1, 1, 1, 1, 4), (200-8)/9))
cumsum(diffs)
给予:
[1] 8 9 10 11 12 13 17 18 19 20 21 22 26 27 28 29 30 31
[19] 35 36 37 38 39 40 44 45 46 47 48 49 53 54 55 56 57 58
[37] 62 63 64 65 66 67 71 72 73 74 75 76 80 81 82 83 84 85
[55] 89 90 91 92 93 94 98 99 100 101 102 103 107 108 109 110 111 112
[73] 116 117 118 119 120 121 125 126 127 128 129 130 134 135 136 137 138 139
[91] 143 144 145 146 147 148 152 153 154 155 156 157 161 162 163 164 165 166
[109] 170 171 172 173 174 175 179 180 181 182 183 184 188 189 190 191 192 193
[127] 197
我想在 R 中创建一种嵌套的规则序列。它遵循重复模式,但值之间没有一致的间隔。它是:
8, 9, 10, 11, 12, 13, 17, 18, 19, 20, 21, 22, 26, 27, 28, ....
所以 6 个数字,间隔为 1,然后间隔为 3,然后再次相同。我希望一直到 200 左右,理想情况下能够指定该终点。
我尝试过使用 rep
和 seq
,但不知道如何将 定期变化 间隔长度放入任一函数中。
我开始绘制它并考虑根据长度创建一个阶梯函数...它不会那么难 - 我不知道的 trick/magic 包是什么??
我的第一次尝试是使用 for 循环,但请记住,与内置函数相比,它们速度较慢。但是因为你只想 "count" 到 200,它应该足够快了。
for(i=1:199) {
if( mod(i, 7) != 0) {
result[i+1] = result[i] + 1;
} else {
result[i+1] = result[i] + 3;
}
}
注意:回答时我的电脑上没有 Matlab,因此上面的代码未经测试,但我希望你能理解。
无需进行任何数学运算来计算出有多少组等,我们就可以过度生成。
定义术语,我会说你有一组序列,每组 6 个元素。我们将从 100 个小组开始,以确保我们一定 超过 200 个门槛。
n_per_group = 6
n_groups = 100
# first generate a regular sequence, with no adjustments
x = seq(from = 8, length.out = n_per_group * n_groups)
# then calculate an adjustment to add
# as you say, the interval is 3 (well, 3 more than the usual 1)
adjustment = rep(0:(n_groups - 1), each = n_per_group) * 3
# if your prefer modular arithmetic, this is equivalent
# adjustment = (seq_along(x) %/% 6) * 3
# then we just add
x = x + adjustment
# and subset down to the desired result
x = x[x <= 200]
x
# [1] 8 9 10 11 12 13 17 18 19 20 21 22 26 27 28 29 30
# [18] 31 35 36 37 38 39 40 44 45 46 47 48 49 53 54 55 56
# [35] 57 58 62 63 64 65 66 67 71 72 73 74 75 76 80 81 82
# [52] 83 84 85 89 90 91 92 93 94 98 99 100 101 102 103 107 108
# [69] 109 110 111 112 116 117 118 119 120 121 125 126 127 128 129 130 134
# [86] 135 136 137 138 139 143 144 145 146 147 148 152 153 154 155 156 157
#[103] 161 162 163 164 165 166 170 171 172 173 174 175 179 180 181 182 183
#[120] 184 188 189 190 191 192 193 197 198 199 200
序列中连续值之间的差异由 diffs
给出,因此取其中的 cumsum
。要使其达到约 200,请使用指示的重复值,其中 1+1+1+1+1+4 = 9.
diffs <- c(8, rep(c(1, 1, 1, 1, 1, 4), (200-8)/9))
cumsum(diffs)
给予:
[1] 8 9 10 11 12 13 17 18 19 20 21 22 26 27 28 29 30 31
[19] 35 36 37 38 39 40 44 45 46 47 48 49 53 54 55 56 57 58
[37] 62 63 64 65 66 67 71 72 73 74 75 76 80 81 82 83 84 85
[55] 89 90 91 92 93 94 98 99 100 101 102 103 107 108 109 110 111 112
[73] 116 117 118 119 120 121 125 126 127 128 129 130 134 135 136 137 138 139
[91] 143 144 145 146 147 148 152 153 154 155 156 157 161 162 163 164 165 166
[109] 170 171 172 173 174 175 179 180 181 182 183 184 188 189 190 191 192 193
[127] 197