#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