data = {0.0152, 0.0937, 0.0234, 0.2969, 0.2500, 0.0781, 0.0312};
Somehow this seems too boring, but all the good answers seem taken:
data[[-1]] + data[[-2]] + data[[-3]] - data[[1]] - data[[2]] - data[[3]]
Some find American baseball boring. Well, at least we can speed up an "inning":
threeUPthreeDOWN = Compile[{{data, _Integer, 1}},
data[[-1]] + data[[-2]] + data[[-3]] - data[[1]] - data[[2]] - data[[3]]
]
Then we don't have to wait long for it to be over:
r = RandomInteger[999, {5000}];
Do[threeUPthreeDOWN[r], {500000}] // Timing // First
(* 0.214847 *)
Compared to Mr.Wizard's less fun method:
Do[r[[{-1, -2, -3, 1, 2, 3}]].{1, 1, 1, -1, -1, -1}, {500000}] // Timing // First
(* 0.604915 *)
Boring rules! :)
Horses that know how to count know the following method as an order 3 farrier transform filter:
farrier3[data_List] := Module[{list, n, m, ker},
list = If[EvenQ[n = Length@#], Insert[#, 0, 1 + n++/2], #] &@data;
m = (n - 1)/2;
ker = Sum[Sin[(m - k + 1) x], {k, 3}];
1/(Pi I)
Integrate[list . Table[Exp[I (k - m - 1) x] * ker, {k, n}], {x, -Pi, Pi}] // Re
]
farrier3[data]
(* 0.227 *)
farrier3[Range@12]
(* 27 *)
Clearly this is a lot more fun, but even I get tired of it after a while:
r = RandomInteger[999, {5000}];
farrier3[r] // Timing // First
Hmm...if it ever finishes, I'll update the time. Ah...finally
(* 10371.737221 *)