MATLAB Answers

Apply function to each column in matrix

104 views (last 30 days)
Sebastian
Sebastian on 18 Mar 2016
Commented: Star Strider on 18 Mar 2016
Dear MATLAB community,
In my current code I need to apply (very quickly) a user specified function to each row of a matrix. The function typically looks like this (but can take any other form including nonlinear):
v = @(b) b(1)*x1 + b(2)*x2 + b(3)*x3
(with x's being vectors)
now I have a matrix B of dimension [3 x DRAWS] and need to apply the function to each of the columns. Is there anything similar to the apply() function in R?
In an more advanced version B has the dimension [3 x DRAWS x PEOPLE] where I need to do the same again for both dimensions.
My issue now is the following: I could, of course, apply a simple for loop. However, this is too slow, because DRAWS can be quite large (up to 5000) and PEOPLE can be quite large too (often >1000). Additionally, the entire thing enters another function (log-likelihood) that is optimised using fmincon.
Does anyone have an idea on how to do this efficiently?
Best wishes and thanks a lot in advance!
Sebastian

  0 Comments

Sign in to comment.

Answers (1)

Star Strider
Star Strider on 18 Mar 2016
‘... a matrix B of dimension [3 x DRAWS] and need to apply the function to each of the columns.’
I don’t understand. If ‘DRAWS’ is other than 3, I don’t see how you could use it across columns.
You can apply them across the rows easily enough by adding an extra dimension to the subscript references:
DRAWS = 10;
M = randi(9, 3, DRAWS);
x1 = 2;
x2 = 3;
x3 = 5;
v = @(b) b(1,:)*x1 + b(2,:)*x2 + b(3,:)*x3;
Out = v(M);

  6 Comments

Show 3 older comments
Star Strider
Star Strider on 18 Mar 2016
My pleasure.
I experimented with it with bsxfun and arrayfun, but they aren’t set up for the sort of calculation you want to do. You could also end up with a multi-dimensional matrix as output.
One option could be something like this:
DRAWS = 10;
M = randi(9, 3, DRAWS);
x1 = randi(9, 5, 1);
x2 = randi(9, 5, 1);
x3 = randi(9, 5, 1);
v = @(b) b(1,:)'*x1' + b(2,:)'*x2' + b(3,:)'*x3';
Out = v(M);
but I don’t know if it would generalise to non-linear functions, since I don’t know what ‘non-linear’ means here.
Sebastian
Sebastian on 18 Mar 2016
Ah that could work!!! I will try to implement it in my code! Thanks! PS: Also works for the nonlinear functions I tried!

Sign in to comment.

Sign in to answer this question.