How to vectorize a complex function?
Show older comments
Hello,
I have a rather complex function but I need to vectorize it in order to be able to use a matlab optimization package. My function is
g=@(par) nonbcon(par,J,N,X0,X,EZ,H,H_coeff,Coeff,knots,mesh_fine,M,SplineType,w);
You do not need to know the details of this function. g, accepts a row vector "par" and then as output gives either 0 or 1. However, I need to vectorize g so that it accepts a matrix A and performs the same operation on each row of A. I tried to use arrayfun but it is a bit complicated for me. I need something like the following (of course, this is wrong):
G=@(y)arrayfun(@(x) nonbcon(x),y(i,:));
but, I do not know how to modify G to do the job for me.
Any idea?
Thanks in advance!
Babak
4 Comments
Torsten
on 23 Nov 2022
Unclear.
Jiri Hajek
on 23 Nov 2022
Hi, why don't you use a for loop? Especially if your function is a complex one, as you suggest, then the overhead of the loop will be negligible...
for i=1:N
g(i)=@(parMatrix(i,:)) nonbcon(par,J,N,X0,X,EZ,H,H_coeff,Coeff,knots,mesh_fine,M,SplineType,w);
end
Torsten
on 23 Nov 2022
This will error - a vector of function handles can only be defined as a cell array.
Mohammad Shojaei Arani
on 23 Nov 2022
Answers (1)
Hi Babak,
Here is a one line solution. Whether or not it's more efficient/effective/clearer than the loop is an open question.
Test data for input
rng(101);
test = rand(4,3);
sum(test,2)
Function that accepts a row vector and returns 0 or 1
g = @(par) double(sum(par,2)>1);
Loop solution
r1 = zeros(4,1);
for ii = 1:4,
r1(ii) = g(test(ii,:));
end
r1
One line solution
r2 = cellfun(g,mat2cell(test,ones(size(test,1),1)))
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!