Using Apply on a function with multidimensional input

I have a user defined function which takes multidimensional input, e.g a function that takes two algebraic variables a and b as well as a matrix m and computes some rule function as:

f[a_,b_,m_] := {a :> m[[1,1]]*a + m[[2,1]]*b, b :> m[[1,2]]*a + m[[2,2]]*b}

Now if I had a similar function over just single variables, e.g g[a,b,c,d] I could perform said function using the syntax g @@ vec where vec = {a,b,c,d}. What I would like achieve is something like:

v = {a,b}
m = {{p,q},{r,s}}
f @@ {v,m}

but doing so produces

f[{a, b}, {{p, q}, {r, s}}]

since the braces encompassing the {a,b} variable have been retained. This problem also occurs for the use of Slot, producing identical output for f[#1,#2] &[v,m] and even just f[#, m] &[v]. Neither Join[v,m] or Catenate[{v,m}] produce a useful list to apply.

How can pass a function a list and then a matrix and have it evaluated in the correct manner?

=================

=================

2 Answers
2

=================

There are probably many ways to do this and here are just some examples to get you going into the right direction.

First note that you might simply use Sequence:

f[a_,b_,m_] := {a :> m[[1,1]]*a + m[[2,1]]*b, b :> m[[1,2]]*a + m[[2,2]]*b}

v = {a , b};
m = {{p,q},{r,s}};

f @@ { Sequence @@ v, m }

produces

(*
{a :> {{p, q}, {r, s}}[[1, 1]] a + {{p, q}, {r, s}}[[2, 1]] b,
b :> {{p, q}, {r, s}}[[1, 2]] a + {{p, q}, {r, s}}[[2, 2]] b}
*)

You might also add the vector as a special case to your function definition:

f[ {a_, b_}, m_] := {a :> m[[1,1]]*a + m[[2,1]]*b, b :> m[[1,2]]*a + m[[2,2]]*b}

Instead of naively trying Join[v,m] or Catenate[{v,m}], instead you must add an extra level to the matrix argument, using either:

Join[v,{m}]
(* or *)
Catenate[{v,{m}}]

which both produce the result

{a, b, {{p, q}, {r, s}}}

such that you can now use f @@ Join[v,{m}] to produce the desired output

{a :> a {{p, q}, {r, s}}[[1, 1]] + b {{p, q}, {r, s}}[[2, 1]],
b :> a {{p, q}, {r, s}}[[1, 2]] + b {{p, q}, {r, s}}[[2, 2]]}

  

 

f @@ Append[v, m] will also work.
– J. M.♦
Jun 22 ’15 at 13:35