src/polyfit.cpp

Sat, 14 Oct 2023 18:50:47 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 14 Oct 2023 18:50:47 +0200
changeset 508
7f2ec2bc9d2e
permissions
-rw-r--r--

Added polyfit files.

508
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
1 /**
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
2 * @brief Simple polynomial fitting functions.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
3 * @file polyfit.cpp
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
4 * @autor Henry M. Forson, Melbourne, Florida USA
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
5 *
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
6 *------------------------------------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
7 * MIT License
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
8 *
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
9 * Copyright (c) 2020 Henry M. Forson
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
10 *
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
12 * of this software and associated documentation files (the "Software"), to deal
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
13 * in the Software without restriction, including without limitation the rights
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
15 * copies of the Software, and to permit persons to whom the Software is
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
16 * furnished to do so, subject to the following conditions:
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
17 *
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
18 * The above copyright notice and this permission notice shall be included in all
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
19 * copies or substantial portions of the Software.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
20 *
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
27 * SOFTWARE.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
28 *------------------------------------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
29 */
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
30
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
31 #include "polyfit.h"
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
32
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
33 #include <QDebug>
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
34 #include <math.h>
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
35
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
36
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
37
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
38 // Structure of a matrix.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
39 typedef struct matrix_s
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
40 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
41 int rows;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
42 int cols;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
43 double *pContents;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
44 } matrix_t;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
45
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
46 // MACRO to access a value with a matrix.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
47 #define MATRIX_VALUE_PTR( pA, row, col ) (&(((pA)->pContents)[ (row * (pA)->cols) + col]))
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
48
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
49
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
50 //------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
51 // Private Function Prototypes
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
52 //------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
53
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
54 static matrix_t * createMatrix( int rows, int cols );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
55 static void destroyMatrix( matrix_t *pMat );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
56 static matrix_t * createTranspose( matrix_t *pMat );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
57 static matrix_t * createProduct( matrix_t *pLeft, matrix_t *pRight );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
58
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
59
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
60 //=========================================================
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
61 // Global function definitions
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
62 //=========================================================
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
63
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
64
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
65 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
66 // polyfit()
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
67 // Computes polynomial coefficients that best fit a set
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
68 // of input points.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
69 //
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
70 // The degree of the fitted polynomial is one less than
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
71 // the count of elements in the polynomial vector.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
72 //
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
73 // Uses matrix algebra of the form:
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
74 // A * x = b
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
75 // To solve the MLS equation:
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
76 // (AT) * A * x = (AT) * b
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
77 // where (AT) is the transpose of A.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
78 //
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
79 // If the n+1 input points are {(x0, y0), (x1, y1), ... (xn, yn)},
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
80 // then the i'th row of A is: {(xi)^0, (xi)^1, ... (xn)^n},
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
81 // and the i'th row of b is: {yi}.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
82 //
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
83 // Returns 0 if success,
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
84 // -1 if passed a NULL pointer,
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
85 // -2 if (pointCount < coefficientCount),
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
86 // -3 if unable to allocate memory,
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
87 // -4 if unable to solve equations.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
88 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
89 //int polyfit( int pointCount, point_t pointArray[], int coeffCount, double coeffArray[] )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
90 int Polyfit::polyfit( int pointCount, double *xValues, double *yValues, int coefficientCount, double *coefficientResults )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
91 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
92 int rVal = 0;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
93 int degree = coefficientCount - 1;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
94
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
95 // Check that the input pointers aren't null.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
96 if( (NULL == xValues) || (NULL == yValues) || (NULL == coefficientResults) )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
97 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
98 return -1;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
99 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
100 // Check that pointCount >= coefficientCount.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
101 if(pointCount < coefficientCount)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
102 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
103 return -2;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
104 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
105
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
106 // Make the A matrix:
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
107 matrix_t *pMatA = createMatrix( pointCount, coefficientCount );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
108 if( NULL == pMatA)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
109 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
110 return -3;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
111 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
112
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
113 for( int r = 0; r < pointCount; r++)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
114 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
115 for( int c = 0; c < coefficientCount; c++)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
116 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
117 *(MATRIX_VALUE_PTR(pMatA, r, c)) = powl((xValues[r]), (double) (degree -c));
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
118 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
119 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
120
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
121 // Make the b matrix
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
122 matrix_t *pMatB = createMatrix( pointCount, 1);
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
123 if( NULL == pMatB )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
124 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
125 return -3;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
126 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
127
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
128 for( int r = 0; r < pointCount; r++)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
129 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
130 *(MATRIX_VALUE_PTR(pMatB, r, 0)) = yValues[r];
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
131 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
132
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
133 // Make the transpose of matrix A
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
134 matrix_t * pMatAT = createTranspose( pMatA );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
135 if( NULL == pMatAT )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
136 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
137 return -3;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
138 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
139
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
140 // Make the product of matrices AT and A:
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
141 matrix_t *pMatATA = createProduct( pMatAT, pMatA );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
142 if( NULL == pMatATA )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
143 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
144 return -3;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
145 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
146
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
147 // Make the product of matrices AT and b:
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
148 matrix_t *pMatATB = createProduct( pMatAT, pMatB );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
149 if( NULL == pMatATB )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
150 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
151 return -3;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
152 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
153
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
154 // Now we need to solve the system of linear equations,
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
155 // (AT)Ax = (AT)b for "x", the coefficients of the polynomial.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
156
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
157 for( int c = 0; c < pMatATA->cols; c++ )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
158 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
159 int pr = c; // pr is the pivot row.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
160 double prVal = *MATRIX_VALUE_PTR(pMatATA, pr, c);
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
161 // If it's zero, we can't solve the equations.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
162 if( 0.0 == prVal )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
163 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
164 // printf( "Unable to solve equations, pr = %d, c = %d.\n", pr, c );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
165 rVal = -4;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
166 break;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
167 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
168 for( int r = 0; r < pMatATA->rows; r++)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
169 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
170 if( r != pr )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
171 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
172 double targetRowVal = *MATRIX_VALUE_PTR(pMatATA, r, c);
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
173 double factor = targetRowVal / prVal;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
174 for( int c2 = 0; c2 < pMatATA->cols; c2++ )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
175 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
176 *MATRIX_VALUE_PTR(pMatATA, r, c2) -= *MATRIX_VALUE_PTR(pMatATA, pr, c2) * factor;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
177 // printf( "c = %d, pr = %d, r = %d, c2=%d, targetRowVal = %f, prVal = %f, factor = %f.\n",
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
178 // c, pr, r, c2, targetRowVal, prVal, factor );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
179
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
180 // showMatrix( pMatATA );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
181
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
182 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
183 *MATRIX_VALUE_PTR(pMatATB, r, 0) -= *MATRIX_VALUE_PTR(pMatATB, pr, 0) * factor;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
184 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
185 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
186 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
187 for( int c = 0; c < pMatATA->cols; c++ )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
188 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
189 int pr = c;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
190 // now, pr is the pivot row.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
191 double prVal = *MATRIX_VALUE_PTR(pMatATA, pr, c);
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
192 *MATRIX_VALUE_PTR(pMatATA, pr, c) /= prVal;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
193 *MATRIX_VALUE_PTR(pMatATB, pr, 0) /= prVal;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
194 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
195
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
196 for( int i = 0; i < coefficientCount; i++)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
197 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
198 coefficientResults[i] = *MATRIX_VALUE_PTR(pMatATB, i, 0);
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
199 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
200
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
201
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
202 destroyMatrix( pMatATB );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
203 destroyMatrix( pMatATA );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
204 destroyMatrix( pMatAT );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
205
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
206 destroyMatrix( pMatA );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
207 destroyMatrix( pMatB );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
208 return rVal;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
209 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
210
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
211
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
212 //=========================================================
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
213 // Private function definitions
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
214 //=========================================================
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
215
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
216
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
217 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
218 // createTranspose()
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
219 // Returns the transpose of a matrix, or NULL.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
220 //
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
221 // The caller must free both the allocated matrix
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
222 // and its contents array.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
223 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
224 static matrix_t * createTranspose( matrix_t *pMat )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
225 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
226 matrix_t *rVal = (matrix_t *) calloc(1, sizeof(matrix_t));
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
227 rVal->pContents = (double *) calloc( pMat->rows * pMat->cols, sizeof( double ));
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
228 rVal->cols = pMat->rows;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
229 rVal->rows = pMat->cols;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
230 for( int r = 0; r < rVal->rows; r++ )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
231 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
232 for( int c = 0; c < rVal->cols; c++ )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
233 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
234 *MATRIX_VALUE_PTR(rVal, r, c) = *MATRIX_VALUE_PTR(pMat, c, r);
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
235 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
236 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
237 return rVal;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
238 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
239
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
240 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
241 // createProduct()
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
242 // Returns the product of two matrices, or NULL.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
243 //
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
244 // The caller must free both the allocated product matrix
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
245 // and its contents array.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
246 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
247 static matrix_t * createProduct( matrix_t *pLeft, matrix_t *pRight )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
248 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
249 matrix_t *rVal = NULL;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
250 if( (NULL == pLeft) || (NULL == pRight) || (pLeft->cols != pRight->rows) )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
251 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
252 printf( "Illegal parameter passed to createProduct().\n");
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
253 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
254 else
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
255 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
256 // Allocate the product matrix.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
257 rVal = (matrix_t *) calloc(1, sizeof(matrix_t));
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
258 rVal->rows = pLeft->rows;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
259 rVal->cols = pRight->cols;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
260 rVal->pContents = (double *) calloc( rVal->rows * rVal->cols, sizeof( double ));
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
261
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
262 // Initialize the product matrix contents:
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
263 // product[i,j] = sum{k = 0 .. (pLeft->cols - 1)} (pLeft[i,k] * pRight[ k, j])
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
264 for( int i = 0; i < rVal->rows; i++)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
265 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
266 for( int j = 0; j < rVal->cols; j++ )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
267 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
268 for( int k = 0; k < pLeft->cols; k++)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
269 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
270 *MATRIX_VALUE_PTR(rVal, i, j) +=
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
271 (*MATRIX_VALUE_PTR(pLeft, i, k)) * (*MATRIX_VALUE_PTR(pRight, k, j));
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
272 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
273 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
274 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
275 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
276
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
277 return rVal;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
278 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
279
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
280 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
281 // destroyMatrix()
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
282 // Frees both the allocated matrix and its contents array.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
283 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
284 static void destroyMatrix( matrix_t *pMat )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
285 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
286 if(NULL != pMat)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
287 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
288 if(NULL != pMat->pContents)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
289 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
290 free(pMat->pContents);
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
291 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
292 free( pMat );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
293 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
294 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
295
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
296 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
297 // createMatrix()
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
298 // Allocates the matrix and clears its contents array.
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
299 //--------------------------------------------------------
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
300 static matrix_t *createMatrix( int rows, int cols )
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
301 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
302 matrix_t *rVal = (matrix_t *) calloc(1, sizeof(matrix_t));
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
303 if(NULL != rVal)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
304 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
305 rVal->rows = rows;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
306 rVal->cols = cols;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
307 rVal->pContents = (double *) calloc( rows * cols, sizeof( double ));
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
308 if(NULL == rVal->pContents)
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
309 {
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
310 free( rVal );
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
311 rVal = NULL;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
312 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
313 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
314
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
315 return rVal;
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
316 }
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
317
7f2ec2bc9d2e Added polyfit files.
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
318

mercurial