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

3 Ansichten (letzte 30 Tage)
reza hamzeh
reza hamzeh am 17 Dez. 2019
Kommentiert: reza hamzeh am 17 Dez. 2019
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)

Akzeptierte Antwort

Matt J
Matt J am 17 Dez. 2019
Bearbeitet: Matt J am 17 Dez. 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)

Weitere Antworten (1)

Matt J
Matt J am 17 Dez. 2019
Bearbeitet: Matt J am 17 Dez. 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 Kommentare
Matt J
Matt J am 17 Dez. 2019
reza's answer converted to commented:
is there any other way?
Matt J
Matt J am 17 Dez. 2019
Bearbeitet: Matt J am 17 Dez. 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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Programming finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by