Replace certain elements of vector with the values from another vector

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 件のコメント

Myrto Kasioumi
Myrto Kasioumi 2020 年 5 月 25 日
Thank you.
I tried that before because I saw that someone else suggested that to some other post but still I get the following error back:
Index exceeds the number of array elements (66).
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.
Myrto Kasioumi
Myrto Kasioumi 2020 年 5 月 26 日
Oh I see. Thank you so much

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by