/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
Äëÿ îïåðàöèé òðàíñïîíèðîâàíèÿ, óìíîæåíèÿ,óäàëåíèÿ ñòðîêè èëè ñòîëáöà ìàòðèöû ìîãóò áûòü ïðÿìîóãîëüíûìè,
ïîýòîìó èñïîëüçóåòñÿ äâà ïàðàìåòðà, äëèííà ñòðîêè è âûñîòà ñòîëáöà.
Îñòàëüíûå ôóíêöèè ðàáîòàþò ñ êâàäðàòíûìè ìàòðèöàìè, è èñïîëüçóþò îäèí ïàðàìåòð äëèííà ñòðîêè.
void transpose() -îïåðàöèÿ ÒÐÀÍÑÏÎÍÈÐÎÂÀÍÈß
void multiplying() -îïåðàöèÿ ÓÌÍÎÆÅÍÈß
void inverse() -îïåðàöèÿ ÎÁÐÀÙÅÍÈß
void pull_line() -çàäàííóþ h ÓÄÀËßÅÌ ÑÒÐÎÊÓ
void pull_column() -çàäàííûé v ÓÄÀËßÅÌ ÑÒÎËÁÅÖ
double minor_AD() -âû÷èñëåíèå ÌÈÍÎÐÀ(Àëãåáðàè÷åñêîå Äîïîëíåíèå)
double det() -âû÷èñëåíèå ÎÏÐÅÄÅËÈÒÅËß
double ox() -âû÷èñëåíèå 1/X
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
//+------------------------------------------------------------------+
//| Matrix_Solve_lib.mq4 |
//| Urain |
//+------------------------------------------------------------------+
#property copyright "Urain"
#property link ""
#property library
//=====================================================================================================
//ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ
//=====================================================================================================
//VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_VOID_
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void transpose -îïåðàöèÿ ÒÐÀÍÑÏÎÍÈÐÎÂÀÍÈß
a - ìàòðèöà
n - äëèííà ñòðîêè
m - äëèííà ïòîëáöà
ðåçóëüòàò â òîìæå ìàññèâå
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void transpose( double& a[], int n, int m)
{//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
int i,j,s=0; int nm=n*m;
double b[];ArrayResize(b,nm);
for(j=0;j<n;j++)//i-ñòîëáöè j-ñòðîêè
{for(i=0;i<m;i++)
{b[s]=a[i*n+j];
s++;
}
}
for(i=0;i<s;i++)a[i]=b[i];
return;
}//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void multiplying -îïåðàöèÿ ÓÌÍÎÆÅÍÈß
a - ìàòðèöà q q
n
n
b - ìàòðèöà m m
q
q
q - äëèííà ñòðîêè a[qxn] è ñòîëáöà b[mxq]
n - äëèííà ñòîëáöà a[]
m - äëèííà ñòðîêè b[]
ðåçóëüòàò â ìàññèâå a[]
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void multiplying( double& a[], double& b[], int n, int q, int m)
{//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
int i,j,k,s=0; int qn=q*n, mq=m*q, nm=n*m;
double c[];ArrayResize(c,nm);
transpose( b, m, q);
for(j=0;j<n;j++)
{for(k=0;k<m;k++)
{double temp=0.0;
for(i=0;i<q;i++)temp+=a[j*q+i]*b[k*q+i];
c[s]=temp;s++;
}
}
ArrayResize(a,nm);
for(i=0;i<nm;i++)a[i]=c[i];
return;
}//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void inverse -îïåðàöèÿ ÎÁÐÀÙÅÍÈß
a - ìàòðèöà
n - äëèííà ñòðîêè,ñòîëáöà
ðåçóëüòàò â ìàññèâå a[]
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void inverse( double& a[], int n)
{//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
int i,j,s=0; int N=n,NN=n*n; double AD =0.0;
double b[];ArrayResize(b,NN);for(i=0;i<NN;i++)b[i]=a[i];
double Det=det( b, N); Det=ox( Det);
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
{AD = minor_AD( b, N, i, j, 1);
a[s]= AD*Det;
s++;
}
}
transpose( a, N, N);
return;
}//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void pull_line - òÿíóòü çàäàííóþ h ñòðîêó ÓÄÀËßÅÌ ÑÒÐÎÊÓ
a - ìàòðèöà
n - äëèííà ñòðîêè
m - äëèííà còîëáöà
ðåçóëüòàò â ìàññèâå a[]
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void pull_line( double& a[], int h, int n, int m)
{//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
int i,j,s=0; int nm=n*(m-1);//i-ñòîëáöè j-ñòðîêè
double b[];ArrayResize(b,nm);
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
{if(i!=h)
{b[s]=a[i*n+j];
s++;
}
}
}
ArrayResize(a,nm);
for(i=0;i<nm;i++)a[i]=b[i];
return;
}//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void pull_column - òÿíóòü çàäàííóþ h ñòîëáåö ÓÄÀËßÅÌ ÑÒÎËÁÅÖ
a - ìàòðèöà
n - äëèííà ñòðîêè
m - äëèííà còîëáöà
ðåçóëüòàò â ìàññèâå a[]
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
void pull_column( double& a[], int v, int n, int m)
{//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
int i,j,s=0; int nm=(n-1)*m;//i-ñòîëáöè j-ñòðîêè
double b[];ArrayResize(b,nm);
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
{if(j!=v)
{b[s]=a[i*n+j];
s++;
}
}
}
ArrayResize(a,nm);
for(i=0;i<nm;i++)a[i]=b[i];
return;
}//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
// DOUBLE__DOUBLE__DOUBLE__DOUBLE__DOUBLE__DOUBLE__DOUBLE__DOUBLE__DOUBLE__DOUBLE__DOUBLE__DOUBLE__
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
double minor_AD - âû÷èñëåíèå ÌÈÍÎÐÀ
åñëè fl=true òî âû÷èñëÿåòñÿ Àëãåáðàè÷åñêîå Äîïîëíåíèå
a - ìàòðèöà
I - íîìåð ñòðîêè
J - íîìåð còîëáöà
ðåçóëüòàò â Minor
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
double minor_AD( double a[], int n, int I, int J, bool fl=0)
{//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
int i,j,s=0; int N=n,NN=n*n;
double b[];ArrayResize(b,NN);for(i=0;i<NN;i++)b[i]=a[i];
pull_line( b, I, N, N);
pull_column( b, J, N, N);
double Minor=det( b, N-1);
if(fl)Minor*=MathPow(-1.0,I+J);
return(Minor);
}//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
double det - âû÷èñëåíèå ÎÏÐÅÄÅËÈÒÅËß
a - ìàòðèöà
n - äëèííà ñòðîêè
m - äëèííà còîëáöà
ðåçóëüòàò â Det
/*///+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
double det( double a[], int n)
{//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
int N=n,NN=n*n;
int i,j,s=0; double Det=a[0];
double b[];ArrayResize(b,NN);
for(i=0;i<NN;i++)b[i]=a[i];
double c[];//ñòðîêè
double d[];//ñòîëáöû
while(N>1)
{ArrayResize(c,N-1);//ñòðîêè
ArrayResize(d,N-1);//ñòîëáöû
for(i=1;i<N;i++)c[i-1]=b[i];
for(i=1;i<N;i++)d[i-1]=b[i*N];
double Glav=b[0]; Glav=ox( Glav);
pull_line( b, 0, N, N);
pull_column( b, 0, N, N);
s=0;
for(i=0;i<N-1;i++)
{for(j=0;j<N-1;j++)
{b[s]-=c[j]*d[i]*Glav;
s++;
}
}
Det*=b[0];
N--;NN=N*N;
}
return(Det);
}//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
/*///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
////////////////////////////////////////////// ÎÄÍÀ ÈÊÑÎÂÀß
/*///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
double ox( double x)
{//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
double y=0.0;
if(x!=0.0) y=1.0/x;
else y= 1.0/MathPow(10.0,300);
return(y);
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
//=====================================================================================================
//ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ
//=====================================================================================================
Comments