Как создать матрицу со смещенной версией вектора сигнала samaples в r? - PullRequest
2 голосов
/ 01 мая 2019

Этот вопрос я уже задавал для Matlab и получил требуемый ответ. Здесь есть ссылка на этот вопрос - , как создать матрицу со смещенной версией отсчетов сигналов в Matlab? . Поскольку я работаю над своими данными как в Matlab, так и в r, я пытаюсь разработать один и тот же код для r. В этой попытке я задал следующий вопрос по приведенной ссылке - Как сформировать матрицу из логических «1» и « 0 ', используя два вектора и логические операторы в r? , теперь используя ответ, данный (еще не принятый) на мой второй вопрос, я разработал следующий код r.

library("pracma")
x=c(1:10)
N=numel(x)
step=2
index=seq(N,1,by=-step)
M=numel(index)
r1 <- c(rbind((index), rev(index)))
val<-matrix(rep(rep(c(1, 0), M), r1), ncol = M)
val1=val*matrix(repmat(c(x,matrix(0,1,step)),1,M),12,M)
out=matrix(val1[1:(N*M)],N,M)

, в результате чего

 > out
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    2    0    0    0    0
[3,]    3    1    0    0    0
[4,]    4    2    0    0    0
[5,]    5    3    1    0    0
[6,]    6    4    2    0    0
[7,]    7    5    3    1    0
[8,]    8    6    4    2    0
[9,]    9    7    5    3    1
[10,]   10    8    6    4    2

но когда я изменю размер шага, он не будет работать, как я могу сделать этот код более обобщенным для размера шага?

1 Ответ

1 голос
/ 01 мая 2019

Как упомянул @NelsonGon в комментариях, создание функции с небольшой модификацией кода поможет

f1 <- function(v, step) {

    N <- pracma::numel(v)
    index <- seq(N,1,by=-step)
    M <- pracma::numel(index)
    r1 <- c(rbind((index), rev(index)))
    val <- matrix(rep(rep(c(1, 0), M), r1), ncol = M)
    val[!!val] <- sequence(colSums(val))
    apply(val[x,], 2, function(x) x[order(x != 0)])
}

-тестирование

f1(1:10, 2)
#       [,1] [,2] [,3] [,4] [,5]
# [1,]    1    0    0    0    0
# [2,]    2    0    0    0    0
# [3,]    3    1    0    0    0
# [4,]    4    2    0    0    0
# [5,]    5    3    1    0    0
# [6,]    6    4    2    0    0
# [7,]    7    5    3    1    0
# [8,]    8    6    4    2    0
# [9,]    9    7    5    3    1
#[10,]   10    8    6    4    2

f1(1:10, 3)
#      [,1] [,2] [,3] [,4]
# [1,]    1    0    0    0
# [2,]    2    0    0    0
# [3,]    3    0    0    0
# [4,]    4    1    0    0
# [5,]    5    2    0    0
# [6,]    6    3    0    0
# [7,]    7    4    1    0
# [8,]    8    5    2    0
# [9,]    9    6    3    0
#[10,]   10    7    4    1

Примечание. Если вы хотите сохранить столбцы только с 0, это можно сделать в функции

f1(1:10, 4)
#        [,1] [,2] [,3]
# [1,]    1    0    0
# [2,]    2    0    0
# [3,]    3    0    0
# [4,]    4    0    0
# [5,]    5    1    0
# [6,]    6    2    0
# [7,]    7    3    0
# [8,]    8    4    0
# [9,]    9    5    1
#[10,]   10    6    2

f1(1:10, 5)
#      [,1] [,2]
# [1,]    1    0
# [2,]    2    0
# [3,]    3    0
# [4,]    4    0
# [5,]    5    0
# [6,]    6    1
# [7,]    7    2
# [8,]    8    3
# [9,]    9    4
#[10,]   10    5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...