Please help me, I'm writing my project and dont know how to solve this big matrix:
I have to compute return row by row: 1st row: (18.32-17.14)/17.14 ; (19.17-18.32)/18.32 .... 2nd row:(11.79-13.86)/13.86 ; (11.37-11.79)/11.79 ....
m = {{17.14, 18.32, 19.17, 20.63},
{13.86, 11.79, 11.37, 13.45},
{49.9, 48.77, 52.3, 56.87}};
compute = Partition[#, 2, 1] /. {a_, b_} :> b/a - 1 &;
compute /@ m
{{0.0688448, 0.0463974, 0.0761607}, {-0.149351, -0.0356234, 0.182938}, {-0.0226453, 0.0723806, 0.0873805}}
Alternatively:
m = {{a, b, c}, {d, e, f}};
compute = (Ratios@#) - 1 &;
compute /@ m
{{-1 + b/a, -1 + c/b}, {-1 + e/d, -1 + f/e}}
Edit
Some timings :-
Clear[o, p, q, r]
Subsets[{o, p, q, r}, {2}]
m = RandomReal[20, {3000, 3000}];
f1 = (Differences@#/Most@#) &;
f2 = Partition[#, 2, 1] /. {a_, b_} :> b/a - 1 &;
f3 = (Ratios@#) - 1 &;
f4 = (Rest@#/Most@#) - 1 &;
o = f1 /@ m;
p = f2 /@ m;
q = f3 /@ m;
r = f4 /@ m;
Equal @@@ Subsets[{o, p, q, r}, {2}]
Flatten[Chop[#1 - #2] & @@@ Subsets[{o, p, q, r}, {2}]] // Union
{{o, p}, {o, q}, {o, r}, {p, q}, {p, r}, {q, r}}
{False, False, False, False, True, False}
{-1.16415*10^-10, 0, 1.16415*10^-10}
Only f2
and f4
produce exactly the same results, but the differences are all minute.
t = First@Timing[# /@ m] &;
t /@ {f1, f2, f3, f4}
{0.216709, 14.198865, 0.179863, 0.145772}
The Partition
method, (f2
), is by far the slowest!
m = {{a, b, d}, {d, e, f}}
Differences /@ m /Most /@ m
(*
{{(-a + b)/a, (-b + d)/b}, {(-d + e)/d, (-e + f)/e}}
*)
Differences
andMost
in the help. Also,Listable
functions. $\endgroup$Differences
so I found it a useful question. $\endgroup$