Команда Matlab diff с большим шагом

#arrays #matlab #matrix

#массивы #matlab #матрица

Вопрос:

Команда 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]
  

Ответ №1:

Для векторов

Я бы использовал свертку с ядром [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');
  

дает

 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');
  

дает

 result =
     2     2
     4     4
     4     4
  

Комментарии:

1. спасибо за ваше предложение. но будет ли свертка работать для матрицы в целом?

2. Отличное решение для N-мерных массивов!

3. @HansHirse Спасибо! Свертка — ключ к успеху 🙂

Ответ №2:

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

 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