Replace certain elements of vector with the values from another vector

조회 수: 3 (최근 30일)
Hello!
I have 2 vectors with the same length: S_1 and S_2
I wanna substitute some values of S_1 with values of S_2 for some specific positions. For example I wanna substitute the 3d value of S_1 with the 3d value of S_2 and so on. I have saved the positions in another vector called m.
My code so far is:
syms S(t) P(t) c(t) z(t) A b g v k u d r w t Y
eqn1 = diff(S,t) == A*(b*S)^(1-g)*(z^g) - k*z - c - b*S*(k+1);
eqn2 = diff(P,t) == u*z - d*P + (1-b)*S;
eqn3 = diff(c,t) == (((1-b)/u) * (v - A*g*(b*S)^(1-g)*z^(g-1)) + b * (A*(1-g)*b^(-g)*S^(-g)*b*z^(g) -k -1) - r) * c;
eqn4 = diff(z,t) == (((A*g*(b*S)^(1-g)*z^(g-1)-v)/(A*g*(g-1)*(b*S)^(1-g)*z^(g-2))) * (d + (((1-w)*c*u)/(w*P*(v-A*g*(b*S)^(1-g)*z^(g-1)))) + (b*(A*(1-g)*b*(b*S)^(-g)*z^g - k - 1)) + (((1-b)*(v-A*g*(b*S)^(1-g)*z^(g-1)))/u))) - (((b*A*g*b*(1-g)*(b*S)^(-g)*z^(g-1))/(A*g*(g-1)*(b*S)^(1-g)*z^(g-2))) * (A*(b*S)^(1-g)*z^g - v*z - c - b*S*(k+1)));
[VF,Subs] = odeToVectorField(eqn1,eqn2,eqn3,eqn4);
odefcn = matlabFunction(VF, 'Vars',{t,A,Y,b,d,g,k,r,u,v,w});
A=3;
b=0.4;
g=0.3;
v=2;
k=4;
u=10;
d=0.2;
r=0.5;
w=0.7;
tspan = [0 6000];
y0 = [100 60 30 50];
[t,Y] = ode45(@(t,Y) odefcn(t,A,Y,b,d,g,k,r,u,v,w) , tspan, y0);
P_1 = Y(:,1);
S_1 = Y(:,2);
c_1 = Y(:,3);
z_1 = Y(:,4);
x_1 = b*S;
sP = size(P_1);
MPx = (1-g)*(b*A*S_1).^(-g).*z_1.^g*b.*A;
MPz = g*(b*A*S_1).^(1-g).*z_1.^(g-1);
m = find(MPx(:,1)<MPz(:,1));
sm = size(m);
g=0.7;
tspan2 = linspace(0, 1000, sP(1));
n0 = [100 60 30 50];
[t,N] = ode45(@(t,N) odefcn(t,A,N,b,d,g,k,r,u,v,w) , tspan2, n0);
P_2 = N(:,1);
S_2 = N(:,2);
c_2 = N(:,3);
z_2 = N(:,4);
x_2 = b*S;
for j=m(1):m(sm(1))
S_1(j,1)=S_2(j,1)
end
Now for the values that MPx is smaller than MPz I wanna substitute the values of S_1 with the values of S_2. For example if MPx < MPz in the third entry then I wanna set the 3d value of S_1 to be equal to the 3d value of S_2.
Any help would be appreciated.
Thanks in advance!
  댓글 수: 2
Ruben Lange
Ruben Lange 2020년 5월 25일
편집: Ruben Lange 2020년 5월 25일
Hi!
Could you indeed upload your entire code?
Also, could you specify which entries in the vectors S_1 and S_2 you want to change? I don't know what the criteria are...
Thanks
Myrto Kasioumi
Myrto Kasioumi 2020년 5월 25일
I just uploaded it.
In vector m I have all the rows that I wanna substitute. I get m from the comparison between MPx and MPz. According to this comparison I am using different code. The first part uses g=0.7 and I find S_1, MPx and MPz. Then I re-run the code but for g=0.3 and I find S_2. In the end I wanna have one vector with the values of S_1 but for the specific entries that MPx<MPz I wanna substitute the values of S_1 with the values of S_2.
Thank you!

댓글을 달려면 로그인하십시오.

채택된 답변

Ameer Hamza
Ameer Hamza 2020년 5월 25일
There is no need for a for-loop
S_1(m) = S_2(m);
  댓글 수: 3
Ameer Hamza
Ameer Hamza 2020년 5월 26일
The element of vector 'm' is above 281. However, there are just 66 elements in S_2. You cannot access more than 66 elements from S_2.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Bartlett에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by