how to make a matrix-function from other matrix-function?

1 view (last 30 days)
hi. i want to plot the function N. every thing work well except the pa-function. in fact i dont know how to make a matrix-function (pa) from the other matrix-function (ro)
in mathematica its easy to do but in matlab i dont know how to do that? is it possible? can you help me plz.
T=1;
Haf = str2func(sprintf('@(%s)%s;','var1','[var1/2 0 0 0;0 -var1/2 var1 0;0 var1 -var1/2 0;0 0 0 var1/2]'));
ro=@(var1) expm(-Haf(var1)/T)/trace(expm(-Haf(var1)/T));
range1=0:0.1:10;
pa =@(var1) [ro(1,1) ro(2,1) ro(1,3) ro(2,3);ro(1,2) ro(2,2) ro(1,4) ro(2,4);
ro(3,1) ro(4,1) ro(3,3) ro(4,3);ro(3,2) ro(4,2) ro(3,4) ro(4,4)];
N = @(var1) 0.5*(sum(abs(eig(pa(var1))))-1);
for k=1:numel(range1)
Nv(k) = N(range1(k));
end
plot(range1,Nv)

Accepted Answer

Matt J
Matt J on 17 Dec 2019
Edited: Matt J on 17 Dec 2019
Here's yet another way, which uses only anonymous functions,
T=1;
Haf = str2func(sprintf('@(%s)%s;','var1','[var1/2 0 0 0;0 -var1/2 var1 0;0 var1 -var1/2 0;0 0 0 var1/2]'));
ro=@(var1) expm(-Haf(var1)/T)/trace(expm(-Haf(var1)/T));
ex=@(r)[r(1,1) r(2,1) r(1,3) r(2,3);r(1,2) r(2,2) r(1,4) r(2,4);
r(3,1) r(4,1) r(3,3) r(4,3);r(3,2) r(4,2) r(3,4) r(4,4)];
pa=@(var1) ex(ro(var1)) ;
N = @(var1) 0.5*(sum(abs(eig(pa(var1))))-1);
range1=0:0.1:10;
for k=1:numel(range1)
Nv(k) = N(range1(k));
end
plot(range1,Nv)

More Answers (1)

Matt J
Matt J on 17 Dec 2019
Edited: Matt J on 17 Dec 2019
One way would be to make pa() a nested function,
function mainFunc
T=1;
Haf = str2func(sprintf('@(%s)%s;','var1','[var1/2 0 0 0;0 -var1/2 var1 0;0 var1 -var1/2 0;0 0 0 var1/2]'));
ro=@(var1) expm(-Haf(var1)/T)/trace(expm(-Haf(var1)/T));
range1=0:0.1:10;
N = @(var1) 0.5*(sum(abs(eig(pa(var1))))-1);
for k=1:numel(range1)
Nv(k) = N(range1(k));
end
plot(range1,Nv)
function out=pa(var1)
r=ro(var1);
out=[r(1,1) r(2,1) r(1,3) r(2,3);r(1,2) r(2,2) r(1,4) r(2,4);
r(3,1) r(4,1) r(3,3) r(4,3);r(3,2) r(4,2) r(3,4) r(4,4)];
end
end
  2 Comments
Matt J
Matt J on 17 Dec 2019
reza's answer converted to commented:
is there any other way?
Matt J
Matt J on 17 Dec 2019
Edited: Matt J on 17 Dec 2019
Many others. You could also make it a local function (or put it in a separate mfile), but in that case, you would have to pass ro,
function mainFunc
T=1;
Haf = str2func(sprintf('@(%s)%s;','var1','[var1/2 0 0 0;0 -var1/2 var1 0;0 var1 -var1/2 0;0 0 0 var1/2]'));
ro=@(var1) expm(-Haf(var1)/T)/trace(expm(-Haf(var1)/T));
range1=0:0.1:10;
N = @(var1) 0.5*(sum(abs(eig(pa(var1,ro))))-1);
for k=1:numel(range1)
Nv(k) = N(range1(k));
end
plot(range1,Nv)
end
function out=pa(var1,ro)
r=ro(var1);
out=[r(1,1) r(2,1) r(1,3) r(2,3);r(1,2) r(2,2) r(1,4) r(2,4);
r(3,1) r(4,1) r(3,3) r(4,3);r(3,2) r(4,2) r(3,4) r(4,4)];
end

Sign in to comment.

Categories

Find more on Graphics Performance 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!