Element wise conditional evaluation of a function over a meshgrid

13 vues (au cours des 30 derniers jours)
Adamya Goyal
Adamya Goyal le 9 Avr 2020
Commenté : James Browne le 10 Avr 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

Réponse acceptée

Matt J
Matt J le 10 Avr 2020
Modifié(e) : Matt J le 10 Avr 2020
f = (A==B) .* (A.*(B+2)+lam);
  3 commentaires
Matt J
Matt J le 10 Avr 2020
You're welcome, but please Accept-click the answer to indicate that it worked.
James Browne
James Browne le 10 Avr 2020
That is pretty awesome! Nice work!

Connectez-vous pour commenter.

Plus de réponses (1)

James Browne
James Browne le 10 Avr 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 commentaire
Adamya Goyal
Adamya Goyal le 10 Avr 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).

Connectez-vous pour commenter.

Catégories

En savoir plus sur Get Started with MATLAB dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by