good afternoon everyone can anyone answer me this question ? i have an error in the matlab code
2 views (last 30 days)
Show older comments
No Freed
on 23 Nov 2019
Commented: Walter Roberson
on 24 Nov 2019
here are some of the programs that I'm working on
sou_y = [5 10];
rec_y = [5 25 40];
d = [0.1000 0.0977 0.0908
0.1000 0.0977 0.0908];
pan_ray_total= [ 100.0000 101.9084 105.9481
100.1249 101.1187 104.4031];
t_obs = d;
vsem=zeros(length(sou_y),length(rec_y));
for i= 1 :length(sou_y)
for j= 1:length(rec_y)
vsem(i,j) = pan_ray_total(i,j)/t_obs(i,j);
end
end
v0_linier = sum (sum (vsem )) ./ n_ray ;
t_cal_linier = pan_ray_total ./ v0_linier;
dt_linier = t_obs - t_cal_linier;
for l = 1 :length(sou_y)
dt((length(rec_y)*(1-1 ))+1 :length(rec_y)* 1,1 ) =dt_linier(1,:);
end
G = [ 100.0000 0 0 ; 76.4853 25.4951 0; 45.4063 30.2709 0; 100.1249 0 0; 67.4125 33.7062 0; 34.8010 34.8010 34.8010];
G_linier = G ;
misfit = dt.^2;
We = (misfit).^-1;
m_linier = (inv(G_linier'*diag(We)*G_linier))*G_linier'*diag(We)*dt;
dv_linier = zeros(length(m_linier),l);
v_linier = zeros(length(m_linier),1);
for i = 1 :length(m_linier)
dv_linier (i) = (-1*m_linier(i)*v0_linier^2)/(1 + m_linier(i) * v0_linier);
v_linier(i) = v0_linier + dv_linier(i);
end
and i have problem like this
Error using *
Inner matrix dimensions must agree.
Error in te (line 21)
m_linier = (inv(G_linier'*diag(We)*G_linier))*G_linier'*diag(We)*dt;
how can i fix this?
2 Comments
Walter Roberson
on 23 Nov 2019
What is the difference between this and https://www.mathworks.com/matlabcentral/answers/492720-good-afternoon-everyone-can-anyone-answer-me-this-question-i-have-an-error-in-the-matlab-code ?
Accepted Answer
Walter Roberson
on 23 Nov 2019
I think you need
m_linier = (G_linier*diag(We)*G_linier')\G_linier*diag(We)*dt
4 Comments
Walter Roberson
on 24 Nov 2019
When you construct matrices based on 6 x 3 * 3 x 3 * 3 * 6, then the resulting matrix has rank no more than 3. It cannot possibly have an inverse.
You can proceed using pseudo-inverses, but it is not obvious that the result will have any meaning.
Question for you:
for l = 1 :length(sou_y)
So l is a loop control variable. After the loop, it will be left at the last value it was set to, so l = length(sou_y) is true after the for loop.
dv_linier = zeros(length(m_linier),l);
And there you set dv_linier to have l columns -- that is, to have length(sou_y) columns.
dv_linier (i) = (-1*m_linier(i)*v0_linier^2)/(1 + m_linier(i) * v0_linier);
but your syntax only assigns to dv_linier as if it is a vector. Unless you are doing linear indexing/
There are some valid cases to use linear indexing, but it is not obvious that this is any of those cases. My experiments suggest that it is not a place to use linear indexing to address multiple columns. I would suggest to you that perhaps when you define dv_linier that the number of columns should be 1 (the digit one) rather than l (lower-case L that got more or less accidentally left as length(sou_y))
More Answers (0)
See Also
Categories
Find more on Matrix Indexing 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!