# Element wise conditional evaluation of a function over a meshgrid

6 views (last 30 days)
Adamya Goyal on 9 Apr 2020
Commented: James Browne on 10 Apr 2020
I created a 2-D mesh using meshgrid. Now, I want to evaluate a function over this mesh based on the elements of mesh i.e., if the mesh elements are equal then evaluate expression1 else evaluate expression2.
a=linspace(1,2,2);
b=linspace(1,3,3);
[A,B]=meshgrid(a,b)
fact(A,B,0.1)
function f = fact(m,n,lam)
if m==n
f=m.*(n+2)+lam;
else
f=0;
end
end
The above just gives me the matrices A and B and 0 from the else statement. I want it to compare the elements of "m" and "n" and evaluate the "if" part if they are the same. I tried using bsxfun(@eq,m,n) instead of m==n. It gives the same result, 0 from the else part. Below is the output.
A =
1 2
1 2
1 2
B =
1 1
2 2
3 3
ans =
0
Instead, evaluating the following code (no if statement) over the mesh does give me the expected result of the function values over the entire mesh.
a=linspace(1,2,2);
b=linspace(1,3,3);
[A,B]=meshgrid(a,b)
fact(A,B,0.1)
function f = fact(m,n,lam)
f=m.*(n+2)+lam;
end
gives
A =
1 2
1 2
1 2
B =
1 1
2 2
3 3
ans =
3.1000 6.1000
4.1000 8.1000
5.1000 10.1000
The output I am looking for should look like
3.1000 0
0 8.1000
0 0

Matt J on 10 Apr 2020
Edited: Matt J on 10 Apr 2020
f = (A==B) .* (A.*(B+2)+lam);

Adamya Goyal on 10 Apr 2020
Wow. Thank you! This looks like magic. ??
Matt J on 10 Apr 2020
You're welcome, but please Accept-click the answer to indicate that it worked.
James Browne on 10 Apr 2020
That is pretty awesome! Nice work!

James Browne on 10 Apr 2020
Hello, I believe that I have developed a solution for you:
a=linspace(1,2,2);
b=linspace(1,3,3);
[A,B] = meshgrid(a,b)
fact(A,B,0.1)
function f = fact(m,n,lam)
f = zeros(size(n,1), size(n,2));
for i = 1:size(n,1)
for j = 1:size(n,2)
if m(i,j) == n(i,j)
f(i,j) = m(i,j)*(n(i,j)+2)+lam;
else
f(i,j)=0;
end
end
end
end
Hope this at least helps =)

#### 1 Comment

Adamya Goyal on 10 Apr 2020
Yes. Thank you so much. But, I want to avoid using loops and keep it "vectorized" if possible. Because the mesh I am going to use this for is going to be huge (~10000x10000 or larger).