Вычислить среднее значение каждого элемента, предыдущего и следующего в векторе-строке для всех элементов, начиная со второго - векторизованной реализации - PullRequest
1 голос
/ 14 октября 2019

Я хотел бы вычислить среднее значение для каждого элемента, предыдущего и следующего в векторе-строке, для всех элементов, начиная со второго, и я хотел бы сделать это с помощью векторизованной реализации.

Предположим, у меня есть этот вектор строки:

a = [4, 7, 1, 3, 2];

, который я хочу получить:

b = [4, 3.66, 2, 1.66];

, что, в свою очередь, означает последующие триплеты:
[4 7 1], [7 1 3], [1 3 2], [3 2 0] (ноль условен).
Кстати, приближение к двум цифрам здесь неактуально, оно только дляради примера.


Я придумал этот код:

a = [4 7 1 3 2];

function shifted = generateShiftedValues(rowVec)
    shifted = rowVec;
    for i=2:3
        shifted(i, :) = [rowVec(1, i:end), zeros(1, i-1)];
    endfor
endfunction

b = mean(generateShiftedValues(a)(:, 1:end-1), 1)

но то, что я хотел бы получить, это полностью векторизованная реализация .

Возможно ли это? Есть идеи? Спасибо вам большое.

1 Ответ

3 голосов
/ 14 октября 2019

Свертка - ключ к успеху.

Я бы сказал:

a = [4 7 1 3 2]

n = 3;

b = conv(a, ones(n, 1)) / n;
b = b(3:end-1)


a =
   4   7   1   3   2

b =
   4.00000   3.66667   2.00000   1.66667

Можно легко построить обобщенное решениедля любого количества элементов, подлежащих усреднению, и произвольной «начальной точки». Если вам это нужно, возможно, дайте общее описание в вашем вопросе. Если этого «особого случая» достаточно, это все.

Надеюсь, это поможет!

...