@ -17,7 +17,7 @@ namespace MathNet.Numerics
/// <summary>
/// The coefficients of the polynomial in a
/// </summary>
public double [ ] Coeffs { get ; set ; }
public double [ ] Coefficient s { get ; set ; }
/// <summary>
/// Only needed for the ToString method
@ -31,7 +31,7 @@ namespace MathNet.Numerics
{
get
{
return ( Coeffs = = null ? 0 : Coeffs . Length ) ;
return ( Coefficient s = = null ? 0 : Coefficient s . Length ) ;
}
}
@ -43,14 +43,14 @@ namespace MathNet.Numerics
{
get
{
if ( Coeffs = = null )
if ( Coefficient s = = null )
{
return - 1 ;
}
for ( int i = Coeffs . Length - 1 ; i > = 0 ; i - - )
for ( int i = Coefficient s . Length - 1 ; i > = 0 ; i - - )
{
if ( Coeffs [ i ] ! = 0.0 )
if ( Coefficient s [ i ] ! = 0.0 )
{
return i ;
}
@ -70,45 +70,44 @@ namespace MathNet.Numerics
{
throw new ArgumentOutOfRangeException ( "n must be postive" ) ;
}
Coeffs = new double [ n ] ;
Coefficient s = new double [ n ] ;
}
/// <summary>
/// make Polynomial: e.G 3.0 = 3.0 + 0 x^1 + 0 x^2
/// </summary>
/// <param name="coeff">just the "x^0" part</param>
public Polynomial ( double coeff )
/// <param name="coefficient ">just the "x^0" part</param>
public Polynomial ( double coefficient )
{
this . Coeffs = new double [ 1 ] ;
Coeffs [ 0 ] = coeff ;
Coefficient s = new double [ 1 ] ;
Coefficient s [ 0 ] = coefficient ;
}
/// <summary>
/// make Polynomial: e.G new double[] {5, 0, 2} = "5 + 0 x^1 + 2 x^2"
/// </summary>
/// <param name="coeffs"> Polynomial coefficiens as enumerable</param>
public Polynomial ( IEnumerable < double > coeffs )
/// <param name="coefficient s">Polynomial coefficient s as enumerable</param>
public Polynomial ( IEnumerable < double > coefficient s )
{
if ( coeffs = = null )
if ( coefficient s = = null )
{
throw new ArgumentNullException ( "coeffs" ) ;
throw new ArgumentNullException ( nameof ( coefficients ) ) ;
}
this . Coeffs = coeffs . ToArray ( ) ;
Coefficient s = coefficient s . ToArray ( ) ;
}
/// <summary>
/// make Polynomial: e.G new double[] {5, 0, 2} = "5 + 0 x^1 + 2 x^2"
/// </summary>
/// <param name="coeffs"> Polynomial coefficiens as array</param>
public Polynomial ( double [ ] coeffs )
/// <param name="coefficient s">Polynomial coefficient s as array</param>
public Polynomial ( double [ ] coefficient s )
{
if ( coeffs = = null )
if ( coefficient s = = null )
{
throw new ArgumentNullException ( "coeffs" ) ;
throw new ArgumentNullException ( nameof ( coefficients ) ) ;
}
this . Coeffs = new double [ coeffs . Length ] ;
Array . Copy ( coeffs , this . Coeff s , coeffs . Length ) ;
Coefficient s = new double [ coefficient s . Length ] ;
Array . Copy ( coefficients , Coefficient s , coefficient s . Length ) ;
}
/// <summary>
@ -120,30 +119,27 @@ namespace MathNet.Numerics
return ;
int i = CoefficientCount - 1 ;
while ( i > = 0 & & Coeffs [ i ] = = 0.0 )
while ( i > = 0 & & Coefficient s [ i ] = = 0.0 )
i - - ;
if ( i < 0 )
Coeffs = new double [ 1 ] { 0.0 } ;
Coefficient s = new [ ] { 0.0 } ;
else if ( i = = 0 )
Coeffs = new double [ 1 ] { Coeffs [ 0 ] } ;
Coefficient s = new [ ] { Coefficient s [ 0 ] } ;
else
{
var hold = new double [ i + 1 ] ;
Array . Copy ( Coeffs , hold , i + 1 ) ;
Coeffs = hold ;
Array . Copy ( Coefficient s , hold , i + 1 ) ;
Coefficient s = hold ;
}
}
#region Data Interaction
/// <summary>
/// Least-Squares fitting the points (x,y) to a k-order polynomial y : x -> p0 + p1*x + p2*x^2 + ... + pk*x^k
/// </summary>
public static Polynomial Fit ( double [ ] x , double [ ] y , int order , DirectRegressionMethod method = DirectRegressionMethod . QR )
{
var pArr = MathNet . Numerics . Fit . Polynomial ( x , y , order , method ) ;
var pArr = Numerics . Fit . Polynomial ( x , y , order , method ) ;
return new Polynomial ( pArr ) ;
}
@ -153,7 +149,7 @@ namespace MathNet.Numerics
/// <param name="z">The location where to evaluate the polynomial at.</param>
public double Evaluate ( double z )
{
return MathNet . Numerics . Evaluate . Polynomial ( z , Coeffs ) ;
return Numerics . Evaluate . Polynomial ( z , Coefficient s ) ;
}
/// <summary>
@ -162,32 +158,30 @@ namespace MathNet.Numerics
/// <param name="z">The locations where to evaluate the polynomial at.</param>
public IEnumerable < double > Evaluate ( IEnumerable < double > z )
{
var Ls t = new List < double > ( ) ;
var resul t = new List < double > ( ) ;
foreach ( var item in z )
{
Ls t. Add ( Evaluate ( item ) ) ;
resul t. Add ( Evaluate ( item ) ) ;
}
return Lst ;
}
#endregion
return result ;
}
#region diff/int
public Polynomial Differentiate ( )
{
if ( Coeffs . Length = = 0 )
if ( Coefficients . Length = = 0 )
{
return null ;
}
var t = this . Clone ( ) as Polynomial ;
var t = Clone ( ) as Polynomial ;
t . Trim ( ) ;
var cNew = new double [ t . Coeffs . Length - 1 ] ;
for ( int i = 1 ; i < t . Coeffs . Length ; i + + )
var cNew = new double [ t . Coefficient s . Length - 1 ] ;
for ( int i = 1 ; i < t . Coefficient s . Length ; i + + )
{
cNew [ i - 1 ] = t . Coeffs [ i ] * i ;
cNew [ i - 1 ] = t . Coefficient s [ i ] * i ;
}
var p = new Polynomial ( cNew ) ;
p . Trim ( ) ;
return p ;
@ -195,30 +189,26 @@ namespace MathNet.Numerics
public Polynomial Integrate ( )
{
var t = this . Clone ( ) as Polynomial ;
var t = Clone ( ) as Polynomial ;
t . Trim ( ) ;
var cNew = new double [ t . Coeffs . Length + 1 ] ;
var cNew = new double [ t . Coefficient s . Length + 1 ] ;
for ( int i = 1 ; i < cNew . Length ; i + + )
{
cNew [ i ] = t . Coeffs [ i - 1 ] / i ;
cNew [ i ] = t . Coefficient s [ i - 1 ] / i ;
}
var p = new Polynomial ( cNew ) ;
p . Trim ( ) ;
return p ;
}
#endregion
#region Operators
/// <summary>
/// multiplies a Polynomial by a Polynomial using convolution [ASINCO.libs.subfun.conv(a.Coeffs, b.Coeffs)]
/// </summary>
/// <param name="a">left Polynomial</param>
/// <param name="b">right Polynomial</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial operator * ( Polynomial a , Polynomial b )
public static Polynomial operator * ( Polynomial a , Polynomial b )
{
var aa = a . Clone ( ) as Polynomial ;
var bb = b . Clone ( ) as Polynomial ;
@ -226,12 +216,12 @@ namespace MathNet.Numerics
//a.Trim();
//b.Trim();
double [ ] ret = conv ( aa . Coeffs , bb . Coeffs ) ;
Polynomial ret_p = new Polynomial ( ret ) ;
double [ ] ret = Convolution ( aa . Coefficient s , bb . Coefficient s ) ;
Polynomial resul t = new Polynomial ( ret ) ;
//ret_p.Trim();
return ( ret_p ) ;
return result ;
}
@ -241,13 +231,12 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="k">scalar value</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial operator * ( Polynomial a , double k )
public static Polynomial operator * ( Polynomial a , double k )
{
var aa = a . Clone ( ) as Polynomial ;
for ( int ii = 0 ; ii < aa . Coeffs . Length ; ii + + )
aa . Coeffs [ ii ] * = k ;
for ( int ii = 0 ; ii < aa . Coefficients . Length ; ii + + )
aa . Coefficients [ ii ] * = k ;
return aa ;
}
@ -258,11 +247,11 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="k">scalar value</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial operator + ( Polynomial a , double k )
public static Polynomial operator + ( Polynomial a , double k )
{
var aa = a . Clone ( ) as Polynomial ;
aa . Coeffs [ 0 ] + = k ;
aa . Coefficient s [ 0 ] + = k ;
return aa ;
}
@ -272,11 +261,11 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="k">scalar value</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial operator - ( Polynomial a , double k )
public static Polynomial operator - ( Polynomial a , double k )
{
var aa = a . Clone ( ) as Polynomial ;
a . Coeffs [ 0 ] - = k ;
a . Coefficient s [ 0 ] - = k ;
return aa ;
}
@ -286,12 +275,12 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="k">scalar value</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial operator / ( Polynomial a , double k )
public static Polynomial operator / ( Polynomial a , double k )
{
var aa = a . Clone ( ) as Polynomial ;
for ( int ii = 0 ; ii < aa . Coeffs . Length ; ii + + )
aa . Coeffs [ ii ] / = k ;
for ( int ii = 0 ; ii < aa . Coefficient s . Length ; ii + + )
aa . Coefficient s [ ii ] / = k ;
return aa ;
}
@ -302,7 +291,7 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="b">right Polynomial</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial operator + ( Polynomial a , Polynomial b )
public static Polynomial operator + ( Polynomial a , Polynomial b )
{
return Add ( a , b ) ;
}
@ -313,7 +302,7 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="b">right Polynomial</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial operator - ( Polynomial a , Polynomial b )
public static Polynomial operator - ( Polynomial a , Polynomial b )
{
return Substract ( a , b ) ;
}
@ -324,25 +313,26 @@ namespace MathNet.Numerics
/// <returns>a vector of complex numbers with the roots</returns>
public Complex [ ] GetRoots ( )
{
DenseMatrix A = this . GetEigValMatrix ( ) ;
Complex [ ] c_vec ;
DenseMatrix A = GetEigValMatrix ( ) ;
Complex [ ] roots ;
if ( A = = null )
{
if ( Coeffs . Length < 2 )
if ( Coefficient s . Length < 2 )
{
var val = Coeffs . Length = = 1 ? Coeffs [ 0 ] : Double . NaN ;
c_vec = new Complex [ 1 ] { val } ;
var val = Coefficient s . Length = = 1 ? Coefficient s [ 0 ] : Double . NaN ;
roots = new Complex [ ] { val } ;
}
else
c_vec = new Complex [ 1 ] { new Complex ( - Coeffs [ 0 ] / Coeffs [ 1 ] , 0 ) } ;
roots = new [ ] { new Complex ( - Coefficient s [ 0 ] / Coefficient s [ 1 ] , 0 ) } ;
}
else
{
Evd < double > eigen = A . Evd ( Symmetricity . Asymmetric ) ;
c_vec = eigen . EigenValues . ToArray ( ) ;
roots = eigen . EigenValues . ToArray ( ) ;
}
return c_vec ;
return roots ;
}
/// <summary>
@ -352,26 +342,28 @@ namespace MathNet.Numerics
/// <note>this matrix is similar to the companion matrix of this polynomial, in such a way, that it's transpose is the columnflip of the companion matrix</note>
public DenseMatrix GetEigValMatrix ( )
{
Polynomial pLoc = new Polynomial ( this . Coeffs ) ;
Polynomial pLoc = new Polynomial ( Coefficient s ) ;
pLoc . Trim ( ) ;
int n = pLoc . Coeffs . Length - 1 ;
int n = pLoc . Coefficient s . Length - 1 ;
if ( n < 2 )
{
return null ;
}
double a0 = pLoc . Coefficients [ n ] ;
double [ ] p = new double [ n ] ;
double a0 = pLoc . Coeffs [ n ] ;
for ( int ii = n - 1 ; ii > = 0 ; ii - - )
p [ ii ] = - pLoc . Coeffs [ ii ] / a0 ;
{
p [ ii ] = - pLoc . Coefficients [ ii ] / a0 ;
}
DenseMatrix A0 = DenseMatrix . CreateDiagonal ( n - 1 , n - 1 , 1.0 ) ;
DenseMatrix A = new DenseMatrix ( n ) ;
A . SetSubMatrix ( 1 , 0 , A0 ) ;
A . SetRow ( 0 , p . Reverse ( ) . ToArray ( ) ) ;
return A ;
}
@ -381,24 +373,24 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="b">right Polynomial</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial DividePointwise ( Polynomial a , Polynomial b )
public static Polynomial DividePointwise ( Polynomial a , Polynomial b )
{
var aa = a . Clone ( ) as Polynomial ;
var bb = b . Clone ( ) as Polynomial ;
if ( aa . Coeffs . Length ! = bb . Coeffs . Length )
mkSameLength ( ref aa , ref bb ) ;
int n = aa . Coeffs . Length ;
double [ ] res = new double [ aa . Coeffs . Length ] ;
if ( aa . Coefficients . Length ! = bb . Coefficients . Length )
{
MakeSameLength ( ref aa , ref bb ) ;
}
int n = aa . Coefficients . Length ;
double [ ] res = new double [ aa . Coefficients . Length ] ;
for ( int ii = 0 ; ii < n ; ii + + )
{
res [ ii ] = aa . Coeffs [ ii ] / bb . Coeffs [ ii ] ;
res [ ii ] = aa . Coefficient s [ ii ] / bb . Coefficient s [ ii ] ;
}
Polynomial res_poly = new Polynomial ( res ) ;
return ( res_poly ) ;
return new Polynomial ( res ) ;
}
/// <summary>
@ -407,24 +399,24 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="b">right Polynomial</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial MultiplyPointwise ( Polynomial a , Polynomial b )
public static Polynomial MultiplyPointwise ( Polynomial a , Polynomial b )
{
var aa = a . Clone ( ) as Polynomial ;
var bb = b . Clone ( ) as Polynomial ;
if ( aa . Coeffs . Length ! = bb . Coeffs . Length )
mkSameLength ( ref aa , ref bb ) ;
int n = aa . Coeffs . Length ;
double [ ] res = new double [ aa . Coeffs . Length ] ;
if ( aa . Coefficients . Length ! = bb . Coefficients . Length )
{
MakeSameLength ( ref aa , ref bb ) ;
}
int n = aa . Coefficients . Length ;
double [ ] res = new double [ aa . Coefficients . Length ] ;
for ( int ii = 0 ; ii < n ; ii + + )
{
res [ ii ] = aa . Coeffs [ ii ] * bb . Coeffs [ ii ] ;
res [ ii ] = aa . Coefficient s [ ii ] * bb . Coefficient s [ ii ] ;
}
Polynomial res_poly = new Polynomial ( res ) ;
return ( res_poly ) ;
return new Polynomial ( res ) ;
}
/// <summary>
@ -433,24 +425,24 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="b">right Polynomial</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial Add ( Polynomial a , Polynomial b )
public static Polynomial Add ( Polynomial a , Polynomial b )
{
var aa = a . Clone ( ) as Polynomial ;
var bb = b . Clone ( ) as Polynomial ;
if ( aa . CoefficientCount ! = bb . CoefficientCount )
mkSameLength ( ref aa , ref bb ) ;
{
MakeSameLength ( ref aa , ref bb ) ;
}
int n = aa . CoefficientCount ;
double [ ] res = new double [ n ] ;
for ( int ii = 0 ; ii < n ; ii + + )
{
res [ ii ] = aa . Coeffs [ ii ] + bb . Coeffs [ ii ] ;
res [ ii ] = aa . Coefficient s [ ii ] + bb . Coefficient s [ ii ] ;
}
Polynomial res_poly = new Polynomial ( res ) ;
return ( res_poly ) ;
return new Polynomial ( res ) ;
}
/// <summary>
@ -459,24 +451,24 @@ namespace MathNet.Numerics
/// <param name="a">left Polynomial</param>
/// <param name="b">right Polynomial</param>
/// <returns>resulting Polynomial</returns>
public static Polynomial Substract ( Polynomial a , Polynomial b )
public static Polynomial Substract ( Polynomial a , Polynomial b )
{
var aa = a . Clone ( ) as Polynomial ;
var bb = b . Clone ( ) as Polynomial ;
if ( aa . CoefficientCount ! = bb . CoefficientCount )
mkSameLength ( ref aa , ref bb ) ;
{
MakeSameLength ( ref aa , ref bb ) ;
}
int n = aa . CoefficientCount ;
double [ ] res = new double [ n ] ;
for ( int ii = 0 ; ii < n ; ii + + )
{
res [ ii ] = aa . Coeffs [ ii ] - bb . Coeffs [ ii ] ;
res [ ii ] = aa . Coefficient s [ ii ] - bb . Coefficient s [ ii ] ;
}
Polynomial res_poly = new Polynomial ( res ) ;
return ( res_poly ) ;
return new Polynomial ( res ) ;
}
/// <summary>
@ -497,11 +489,11 @@ namespace MathNet.Numerics
if ( b . CoefficientCount < = 0 )
throw new ArgumentOutOfRangeException ( "b Degree must be greater than zero" ) ;
if ( b . Coeffs [ b . CoefficientCount - 1 ] = = 0 )
if ( b . Coefficient s [ b . CoefficientCount - 1 ] = = 0 )
throw new DivideByZeroException ( "b polynomial ends with zero" ) ;
var c1 = a . Coeffs . ToArray ( ) ;
var c2 = b . Coeffs . ToArray ( ) ;
var c1 = a . Coefficient s . ToArray ( ) ;
var c2 = b . Coefficient s . ToArray ( ) ;
var n1 = c1 . Length ;
var n2 = c2 . Length ;
@ -529,14 +521,15 @@ namespace MathNet.Numerics
var scl = c2 [ n2 - 1 ] ;
var c22 = new double [ n2 - 1 ] ;
for ( int ii = 0 ; ii < c22 . Length ; ii + + )
{
c22 [ ii ] = c2 [ ii ] / scl ;
}
int i = dn ;
int j = n1 - 1 ;
while ( i > = 0 )
{
var v = c1 [ j ] ;
var vals = new double [ j - i ] ;
for ( int k = i ; k < j ; k + + )
c1 [ k ] - = c22 [ k - i ] * v ;
i - - ;
@ -550,10 +543,14 @@ namespace MathNet.Numerics
quo = new double [ l1 ] ;
for ( int k = 0 ; k < l1 ; k + + )
{
quo [ k ] = c1 [ k + j1 ] / scl ;
}
for ( int k = 0 ; k < j1 ; k + + )
{
rem [ k ] = c1 [ k ] ;
}
}
@ -563,7 +560,6 @@ namespace MathNet.Numerics
if ( quo = = null )
throw new NullReferenceException ( "resulting quotient was null" ) ;
// output mapping
var pQuo = new Polynomial ( quo ) ;
var pRem = new Polynomial ( rem ) ;
@ -573,7 +569,6 @@ namespace MathNet.Numerics
return new Tuple < Polynomial , Polynomial > ( pQuo , pRem ) ;
}
/// <summary>
/// Division of two polynomials returning the quotient-with-remainder of the two polynomials given
/// </summary>
@ -584,10 +579,6 @@ namespace MathNet.Numerics
return DivideLong ( this , b ) ;
}
#endregion
#region Displaying
/// <summary>
/// "0.00 x^3 + 0.00 x^2 + 0.00 x^1 + 0.00" like display of this Polynomial
/// </summary>
@ -603,95 +594,84 @@ namespace MathNet.Numerics
/// <returns>string in displayed format</returns>
public string ToString ( bool highestFirst )
{
string strLoc = "" ;
if ( this . Coeffs = = null )
if ( Coefficients = = null )
{
return "null" ;
}
if ( this . Coeffs . Length = = 0 )
if ( Coefficient s . Length = = 0 )
{
return "" ;
}
string result = "" ;
if ( ! highestFirst )
{
for ( int ii = 0 ; ii < Coeffs . Length ; ii + + )
for ( int ii = 0 ; ii < Coefficient s . Length ; ii + + )
{
if ( ii = = 0 & & Coeffs . Length = = 1 )
strLoc + = String . Format ( "{0}" , this . Coeffs [ ii ] , VarName , ii ) ;
if ( ii = = 0 & & Coefficient s . Length = = 1 )
re sul t + = String . Format ( "{0}" , Coefficient s [ ii ] , VarName , ii ) ;
else if ( ii = = 0 )
strLoc + = String . Format ( "{0} + " , this . Coeffs [ ii ] , VarName , ii ) ;
else if ( ii = = Coeffs . Length - 1 )
strLoc + = String . Format ( "{0}{1}{2}" , this . Coeffs [ ii ] , VarName , ii ) ;
re sul t + = String . Format ( "{0} + " , Coefficient s [ ii ] , VarName , ii ) ;
else if ( ii = = Coefficient s . Length - 1 )
re sul t + = String . Format ( "{0}{1}{2}" , Coefficient s [ ii ] , VarName , ii ) ;
else
strLoc + = String . Format ( "{0}{1}{2} + " , this . Coeffs [ ii ] , VarName , ii ) ;
re sul t + = String . Format ( "{0}{1}{2} + " , Coefficient s [ ii ] , VarName , ii ) ;
}
}
else
{
for ( int ii = Coeffs . Length - 1 ; ii > = 0 ; ii - - )
for ( int ii = Coefficient s . Length - 1 ; ii > = 0 ; ii - - )
{
if ( ii = = 0 )
strLoc + = this . Coeffs [ ii ] . ToString ( ) ;
re sul t + = Coefficient s [ ii ] . ToString ( ) ;
else
strLoc + = String . Format ( "{0}{1}{2} + " , this . Coeffs [ ii ] , VarName , ii ) ;
re sul t + = String . Format ( "{0}{1}{2} + " , Coefficient s [ ii ] , VarName , ii ) ;
}
}
return strLoc ;
return re sul t;
}
#endregion
#region Interfacing
/// <summary>
/// This method returns the coefficc ients of the Polynomial as an array the "IsFlipped" property,
/// This method returns the coefficients of the Polynomial as an array the "IsFlipped" property,
/// which is set during construction is taken into account automatically.
/// </summary>
/// <returns>the coefficc ients of the Polynomial as an array</returns>
/// <returns>the coefficients of the Polynomial as an array</returns>
public double [ ] ToArray ( )
{
return ( Coeffs . ToArray ( ) ) ;
return Coefficient s . ToArray ( ) ;
}
#endregion
#region Helpers
private static void mkSameLength ( ref Polynomial a , ref Polynomial b )
static void MakeSameLength ( ref Polynomial a , ref Polynomial b )
{
double [ ] aHold = new double [ a . Coeffs . Length ] ;
double [ ] bHold = new double [ b . Coeffs . Length ] ;
Array . Copy ( a . Coeffs , aHold , a . Coeffs . Length ) ;
Array . Copy ( b . Coeffs , bHold , b . Coeffs . Length ) ;
double [ ] aHold = new double [ a . Coefficients . Length ] ;
double [ ] bHold = new double [ b . Coefficients . Length ] ;
Array . Copy ( a . Coefficients , aHold , a . Coefficients . Length ) ;
Array . Copy ( b . Coefficient s , bHold , b . Coefficient s . Length ) ;
if ( a . Coeffs . Length < b . Coeffs . Length )
if ( a . Coefficient s . Length < b . Coefficient s . Length )
{
a . Coeffs = new double [ b . Coeffs . Length ] ;
b . Coeffs = new double [ b . Coeffs . Length ] ;
Array . Copy ( aHold , a . Coeffs , aHold . Length ) ;
Array . Copy ( bHold , b . Coeffs , bHold . Length ) ;
a . Coefficient s = new double [ b . Coefficient s . Length ] ;
b . Coefficient s = new double [ b . Coefficient s . Length ] ;
Array . Copy ( aHold , a . Coefficient s , aHold . Length ) ;
Array . Copy ( bHold , b . Coefficient s , bHold . Length ) ;
}
else
{
a . Coeffs = new double [ a . Coeffs . Length ] ;
b . Coeffs = new double [ a . Coeffs . Length ] ;
Array . Copy ( aHold , a . Coeffs , aHold . Length ) ;
Array . Copy ( bHold , b . Coeffs , bHold . Length ) ;
a . Coefficient s = new double [ a . Coefficient s . Length ] ;
b . Coefficient s = new double [ a . Coefficient s . Length ] ;
Array . Copy ( aHold , a . Coefficient s , aHold . Length ) ;
Array . Copy ( bHold , b . Coefficient s , bHold . Length ) ;
}
}
/// <summary>
/// (full) convolution of two arrays
/// Full convolution of two arrays
/// </summary>
/// <param name="a">left vector</param>
/// <param name="b">right vector</param>
/// <returns>convolution of a and b as vector</returns>
private static double [ ] conv ( double [ ] a , double [ ] b )
static double [ ] Convolution ( double [ ] a , double [ ] b )
{
double [ ] ret = new double [ a . Length + b . Length ] ;
@ -707,10 +687,8 @@ namespace MathNet.Numerics
public object Clone ( )
{
return new Polynomial ( this . Coeffs ) ;
// TODO: this assumes the constructor does a copy
return new Polynomial ( Coefficients ) ;
}
#endregion
}
}