How to perform mathematical operation of arrays inside loop?
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
I know it is a very basic question, but I have not been able to solve it. I have an array X(28*1). Using values of X for the first time, I would calculate E=B-A*X where E=(352*1), A(352*28) and B=(352*1). Then if the sum of E is larger than 10^-40, The follwoing operations are done:
C=diag(E*E');
W=diag(C)^-1;
X=(A'*W*A)^-1*A'*W*B
Then the updated value of X will be used for E=B-A*X operation. I understand whole thing is required to be inside a loop. But I can not find the exact process to write the code. If anyone has any idea, It would be much appriciated. I have attached the X for 1st iteration, A, and B as .mat file.
6 Kommentare
Bruno Luong
am 19 Jul. 2023
If you want to do robust linear fit with outliers, I recommend you do L1 fitting
minimize norm(A*X - B, 1)
rather than weighted 2-norm (more robust than l2, but still not very robust).
This requires linear programing linprog of optimization toolbox.
Antworten (3)
Matt J
am 18 Jul. 2023
Bearbeitet: Matt J
am 18 Jul. 2023
for i=1:N
E=B-A*X;
if norm(E,1)<1e-40, continue; end
C=E.^2;
X=lscov(A,B,1./C);
end
3 Kommentare
Matt J
am 20 Jul. 2023
Bearbeitet: Matt J
am 20 Jul. 2023
@ANANTA BIJOY BHADRA I notice that the second column of your A matrix is zero, which iof course makes A ill-conditioned.
A=load('A').A_primary_A;
[l,h]=bounds(A(:,2))
cond(A)
cond(A(:, [1,3:end])) %skip second column
Bruno Luong
am 20 Jul. 2023
Bearbeitet: Bruno Luong
am 20 Jul. 2023
Good catch. But I beleive the solution of "\" or lscov, both based on QR decomposition would not be affected by 0 column and remain accurate, despite the warning. The solution corresponds to 0-column is simply nil.
A=rand(10,3);
b=rand(10,1);
As=A; As(:,end+1)=0;
w = 0.1+rand(size(b));
format long
A\b
As\b
lscov(A,b,w)
lscov(As,b,w)
Mrutyunjaya Hiremath
am 18 Jul. 2023
E = B-A*X;
while(sum(E(:))> 10^-40)
C=diag(E*E');
W=diag(C)^-1;
X=(A'*W*A)^-1*A'*W*B;
end
0 Kommentare
Voss
am 18 Jul. 2023
E = B-A*X;
while sum(E,'all') > 1e-40
C = diag(E*E');
W = diag(C)^-1;
X = (A'*W*A)^-1*A'*W*B;
E = B-A*X;
end
0 Kommentare
Siehe auch
Kategorien
Mehr zu Function Creation 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!