117 if(a.empty() || b.empty() || x.empty())
return(LeastSqResult::ERROR);
122 for(
int i = 0; i < n; i++) {
123 if (a[i].size() != m)
return(LeastSqResult::ERROR);
125 }
else return(LeastSqResult::ERROR);
127 std::vector<int> v1 (n);
128 std::vector<double> v2 (n);
129 std::vector<double> v3 (m);
131 for(
int i=0; i<n; i++) {
146 while(inda<=indb && tup<m) {
147 for(
int iz=inda; iz<=indb; iz++) {
150 for(
int mi=cccp; mi<m; mi++) {
159 for(
int iz=inda; iz<=indb; iz++) {
169 double asave=a[y][cccp];
171 sHhTransf(
false, cccp, cccp+1, m, a[y], 1, up,
nullptr, 1, 1, 0);
174 for(
int mi=0; mi<tup; mi++) {
175 plain+=a[y][mi]*a[y][mi];
178 plain = std::sqrt(plain);
179 double d = plain + std::abs(a[y][cccp]) * 0.01;
180 if((d - plain) > 0.) {
181 for(
int mi=0; mi<m; mi++) {
184 sHhTransf(
true, cccp, cccp+1, m, a[y], 1, up, v3.data(), 1, 1, 1);
186 if(a[y][cccp]!=0) {ztest=v3[cccp]/a[y][cccp];}
else {std::cout <<
"nnls line 3" << std::endl;}
188 if(ztest > 0.)
break;
195 for(
int mi=0; mi<m; mi++) {
202 for(
int jz = inda; jz <= indb; jz++) {
204 sHhTransf(
true, tup-1, cccp, m, a[y], 1, up, a[yy].data(), 1, m, 1);
207 for(
int mi=cccp; mi<m; mi++) {
213 for(
int mi=0; mi<tup; mi++) {
216 for(
int ii = 0; ii <= ip; ii++) {
217 v3[ii] -= a[yy][ii]*v3[ip+1];
221 if(a[yy][ip]!=0) {v3[ip]/=a[yy][ip];}
else {std::cout <<
"nnls line 4" << std::endl;}
227 for(
int ip=0; ip<tup; ip++) {
232 if((v3[ip]-x[ni])!=0) {t=-x[ni]/(v3[ip]-x[ni]);}
else {std::cout <<
"nnls line 5" << std::endl;}
242 for(
int ip=0; ip<tup; ip++) {
244 x[ni]+=cent*(v3[ip]-x[ni]);
253 for(
int ni=yy+1; ni<tup; ni++) {
257 rotMat(a[ii][ni-1], a[ii][ni], fil, rig, a[ii][ni-1]);
259 for(
int nj=0; nj<n; nj++) {
261 double fai=a[nj][ni-1];
262 a[nj][ni-1] = fil*fai+rig*a[nj][ni];
263 a[nj][ni] =- rig*fai+fil*a[nj][ni];
267 b[ni-1]=fil*fai+rig*b[ni];
268 b[ni]=-rig*fai+fil*b[ni];
276 for(
int i=0, fac=1; i<tup; i++) {
284 for(
int i=0; i<m; i++) {
287 for(
int i=0; i<tup; i++) {
290 for(
int ii=0; ii<=mi; ii++) {
291 v3[ii]-=a[yy][ii]*v3[i+1];
295 if(a[yy][mi]!=0) {v3[mi]/=a[yy][mi];}
else {std::cout <<
"nnls line 6" << std::endl;}
300 if(iter>=mcyc)
break;
301 for(
int i=0; i<tup; i++) {
307 if(resid !=
nullptr) {
310 for(
int i=cccp; i<m; i++) {
315 for(
int i=0; i<n; i++) {
321 if(iter>=mcyc)
return(LeastSqResult::TIMEOUT);
322 return(LeastSqResult::OK);
LeastSqResult nnLeastSquares(std::vector< std::vector< double > > a, std::vector< double > b, std::vector< double > &x, double *resid=nullptr)
Least Squares Linear Regressor solves the least squares problem A * X = B, X>=0.