Element wise conditional evaluation of a function over a meshgrid

8 visualizzazioni (ultimi 30 giorni)
Adamya Goyal il 9 Apr 2020
Commentato: James Browne il 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
0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Accedi per commentare.

Risposta accettata

Matt J il 10 Apr 2020
Modificato: Matt J il 10 Apr 2020
f = (A==B) .* (A.*(B+2)+lam);
3 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Matt J il 10 Apr 2020
You're welcome, but please Accept-click the answer to indicate that it worked.
James Browne il 10 Apr 2020
That is pretty awesome! Nice work!

Accedi per commentare.

Più risposte (1)

James Browne il 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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Adamya Goyal il 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).

Accedi per commentare.

Categorie

Scopri di più su Surface and Mesh Plots in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by