Команда Matlab diff с большим шагом - PullRequest
1 голос
/ 08 марта 2019

Команда diff вычисляет различия между двумя последовательными элементами. Есть ли способ рассчитать различия между двумя непоследовательными элементами?

Например, с

x = [1,2,3,4,5,6]

есть ли команда для поиска

[x(3)-x(1),x(4)-x(2),x(5)-x(3),x(6)-x(4)] = [2,2,2,2]

или

[x(4)-x(1),x(5)-x(2),x(6)-x(3)] = [3,3,3]

И вообще, для случая с матрицей? Я могу написать некоторый код для этого; Мне просто интересно, есть ли какая-либо существующая команда в Matlab для этого?

Пример случая матрицы

x = [1,2,3,4;1,3,5,7;2,4,6,8] 

и мы хотим найти

[x(1,3)-x(1,1),x(1,4)-x(1,2);x(2,3)-x(2,1),x(2,4)-x(2,2);x(3,3)-x(3,1),x(3,4)-x(3,2)] = [2,2;4,4;4,4]

Ответы [ 2 ]

4 голосов
/ 08 марта 2019

Я не знаю о такой функции, но вы можете просто установить очень простую анонимную функцию

stepDiff = @(x, s) x(:, s:end)-x(:, 1:end-s+1);

Даст выходы как:

x = [1, 2, 3, 4, 5, 6];

>> stepDiff(x, 2)
ans =
   1   1   1   1   1      

>> stepDiff(x, 4)
ans =
   3   3   3

x = [1, 2, 3, 4; 1, 3, 5, 7; 2, 4, 6, 8];

>> stepDiff(x, 3)
ans =
   2   2
   4   4
   4   4
4 голосов
/ 08 марта 2019

для векторов

Я бы использовал свертку с ядром [1 0 ··· 0 -1], где число нулей зависит от желаемого шага . Это можно сделать с помощью функции conv:

x = [1,2,3,4,5,6]; % data
s = 2; % step
result = conv(x, [1 zeros(1,s-1) -1], 'valid');

1012 * дает *

result =
     2     2     2     2

Для матриц или N-мерных массивов

Вышеприведенное можно обобщить, используя convn, с ядром, определенным, как и ранее, но ориентированным вдоль желаемого измерения :

x = [1,2,3,4; 1,3,5,7; 2,4,6,8]; % data
s = 2; % step
d = 2; % dimension
result = convn(x, reshape(([1 zeros(1,s-1) -1]), [ones(1,d-1) s+1 1]), 'valid');

1025 * дает *

result =
     2     2
     4     4
     4     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...