Changeset 42825 for trunk/psLib/src/math/psPolynomial.c
- Timestamp:
- May 8, 2025, 4:47:17 PM (12 months ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psPolynomial.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psPolynomial.c
r41896 r42825 806 806 } 807 807 808 // XXX add 1D, 3D, 4D versions809 bool psPolynomial2DRecycle(psPolynomial2D *poly,810 psPolynomialType type,811 unsigned int nX,812 unsigned int nY)813 {814 PS_ASSERT_INT_NONNEGATIVE(nX, NULL);815 PS_ASSERT_INT_NONNEGATIVE(nY, NULL);816 817 bool match = true;818 match &= (poly->type == type);819 match &= (poly->nX == type);820 match &= (poly->nY == type);821 822 if (!match) {823 for (int i = 0; i < poly->nX + 1; i++) {824 psFree (poly->coeff[i]);825 psFree (poly->coeffErr[i]);826 psFree (poly->coeffMask[i]);827 }828 psFree (poly->coeff);829 psFree (poly->coeffErr);830 psFree (poly->coeffMask);831 832 poly->type = type;833 poly->nX = nX;834 poly->nY = nY;835 836 poly->coeff = psAlloc((1 + nX) * sizeof(psF64 *));837 poly->coeffErr = psAlloc((1 + nX) * sizeof(psF64 *));838 poly->coeffMask = (psMaskType **)psAlloc((1 + nX) * sizeof(psMaskType *));839 for (int i = 0; i < (1 + nX); i++) {840 poly->coeff[i] = psAlloc((1 + nY) * sizeof(psF64));841 poly->coeffErr[i] = psAlloc((1 + nY) * sizeof(psF64));842 poly->coeffMask[i] = (psMaskType *)psAlloc((1 + nY) * sizeof(psMaskType));843 }844 }845 for (int i = 0; i < (1 + nX); i++) {846 for (int j = 0; j < (1 + nY); j++) {847 poly->coeff[i][j] = 0.0;848 poly->coeffErr[i][j] = 0.0;849 poly->coeffMask[i][j] = PS_POLY_MASK_NONE;850 }851 }852 return(true);853 }854 855 // XXX add 1D, 3D, 4D versions856 psPolynomial2D *psPolynomial2DCopy(psPolynomial2D *out,857 psPolynomial2D *poly)858 {859 if (out == NULL) {860 out = psPolynomial2DAlloc (poly->type, poly->nX, poly->nY);861 } else {862 psPolynomial2DRecycle (out, poly->type, poly->nX, poly->nY);863 }864 865 for (int i = 0; i < (1 + poly->nX); i++) {866 for (int j = 0; j < (1 + poly->nY); j++) {867 out->coeff[i][j] = poly->coeff[i][j];868 out->coeffErr[i][j] = poly->coeffErr[i][j];869 out->coeffMask[i][j] = poly->coeffMask[i][j];870 }871 }872 return(out);873 }874 875 808 psPolynomial3D* psPolynomial3DAlloc( 876 809 psPolynomialType type, … … 1002 935 } 1003 936 937 // XXX add 3D, 4D versions 938 bool psPolynomial1DRecycle(psPolynomial1D *poly, 939 psPolynomialType type, 940 unsigned int nX) 941 { 942 PS_ASSERT_INT_NONNEGATIVE(nX, NULL); 943 944 bool match = true; 945 match &= (poly->type == type); 946 match &= (poly->nX == nX); 947 948 if (!match) { 949 polynomial1DFree (poly); // frees the coeffs 950 951 poly->type = type; 952 poly->nX = nX; 953 954 poly->coeff = psAlloc((1 + nX) * sizeof(psF64)); 955 poly->coeffErr = psAlloc((1 + nX) * sizeof(psF64)); 956 poly->coeffMask = (psMaskType *)psAlloc((1 + nX) * sizeof(psMaskType)); 957 } 958 for (int i = 0; i < (1 + nX); i++) { 959 poly->coeff[i] = 0.0; 960 poly->coeffErr[i] = 0.0; 961 poly->coeffMask[i] = PS_POLY_MASK_NONE; 962 } 963 return(true); 964 } 965 966 bool psPolynomial2DRecycle(psPolynomial2D *poly, 967 psPolynomialType type, 968 unsigned int nX, 969 unsigned int nY) 970 { 971 PS_ASSERT_INT_NONNEGATIVE(nX, NULL); 972 PS_ASSERT_INT_NONNEGATIVE(nY, NULL); 973 974 bool match = true; 975 match &= (poly->type == type); 976 match &= (poly->nX == nX); 977 match &= (poly->nY == nY); 978 979 if (!match) { 980 polynomial2DFree (poly); // frees the coeffs 981 982 poly->type = type; 983 poly->nX = nX; 984 poly->nY = nY; 985 986 poly->coeff = psAlloc((1 + nX) * sizeof(psF64 *)); 987 poly->coeffErr = psAlloc((1 + nX) * sizeof(psF64 *)); 988 poly->coeffMask = (psMaskType **)psAlloc((1 + nX) * sizeof(psMaskType *)); 989 for (int i = 0; i < (1 + nX); i++) { 990 poly->coeff[i] = psAlloc((1 + nY) * sizeof(psF64)); 991 poly->coeffErr[i] = psAlloc((1 + nY) * sizeof(psF64)); 992 poly->coeffMask[i] = (psMaskType *)psAlloc((1 + nY) * sizeof(psMaskType)); 993 } 994 } 995 for (int i = 0; i < (1 + nX); i++) { 996 for (int j = 0; j < (1 + nY); j++) { 997 poly->coeff[i][j] = 0.0; 998 poly->coeffErr[i][j] = 0.0; 999 poly->coeffMask[i][j] = PS_POLY_MASK_NONE; 1000 } 1001 } 1002 return(true); 1003 } 1004 1005 bool psPolynomial3DRecycle(psPolynomial3D *poly, 1006 psPolynomialType type, 1007 unsigned int nX, 1008 unsigned int nY, 1009 unsigned int nZ) 1010 { 1011 PS_ASSERT_INT_NONNEGATIVE(nX, NULL); 1012 PS_ASSERT_INT_NONNEGATIVE(nY, NULL); 1013 PS_ASSERT_INT_NONNEGATIVE(nZ, NULL); 1014 1015 bool match = true; 1016 match &= (poly->type == type); 1017 match &= (poly->nX == nX); 1018 match &= (poly->nY == nY); 1019 match &= (poly->nZ == nZ); 1020 1021 if (!match) { 1022 polynomial3DFree (poly); // frees the coeffs 1023 1024 poly->type = type; 1025 poly->nX = nX; 1026 poly->nY = nY; 1027 poly->nZ = nZ; 1028 1029 poly->coeff = psAlloc((nX + 1) * sizeof(psF64 **)); 1030 poly->coeffErr = psAlloc((nX + 1) * sizeof(psF64 **)); 1031 poly->coeffMask = (psMaskType ***)psAlloc((nX + 1) * sizeof(psMaskType **)); 1032 for (int ix = 0; ix < (1 + nX); ix++) { 1033 poly->coeff[ix] = psAlloc((nY + 1) * sizeof(psF64 *)); 1034 poly->coeffErr[ix] = psAlloc((nY + 1) * sizeof(psF64 *)); 1035 poly->coeffMask[ix] = (psMaskType **)psAlloc((nY + 1) * sizeof(psMaskType *)); 1036 for (int iy = 0; iy < (nY + 1); iy++) { 1037 poly->coeff[ix][iy] = psAlloc((nZ + 1) * sizeof(psF64)); 1038 poly->coeffErr[ix][iy] = psAlloc((nZ + 1) * sizeof(psF64)); 1039 poly->coeffMask[ix][iy] = (psMaskType *)psAlloc((nZ + 1) * sizeof(psMaskType)); 1040 } 1041 } 1042 } 1043 for (int ix = 0; ix < (1 + nX); ix++) { 1044 for (int iy = 0; iy < (1 + nY); iy++) { 1045 for (int iz = 0; iz < (1 + nZ); iz++) { 1046 poly->coeff[ix][iy][iz] = 0.0; 1047 poly->coeffErr[ix][iy][iz] = 0.0; 1048 poly->coeffMask[ix][iy][iz] = PS_POLY_MASK_NONE; 1049 } 1050 } 1051 } 1052 return(true); 1053 } 1054 1055 bool psPolynomial4DRecycle(psPolynomial4D *poly, 1056 psPolynomialType type, 1057 unsigned int nX, 1058 unsigned int nY, 1059 unsigned int nZ, 1060 unsigned int nT) 1061 { 1062 PS_ASSERT_INT_NONNEGATIVE(nX, NULL); 1063 PS_ASSERT_INT_NONNEGATIVE(nY, NULL); 1064 PS_ASSERT_INT_NONNEGATIVE(nZ, NULL); 1065 PS_ASSERT_INT_NONNEGATIVE(nT, NULL); 1066 1067 bool match = true; 1068 match &= (poly->type == type); 1069 match &= (poly->nX == nX); 1070 match &= (poly->nY == nY); 1071 match &= (poly->nZ == nZ); 1072 match &= (poly->nT == nT); 1073 1074 if (!match) { 1075 polynomial4DFree (poly); // frees the coeffs 1076 1077 poly->type = type; 1078 poly->nX = nX; 1079 poly->nY = nY; 1080 poly->nZ = nZ; 1081 poly->nT = nT; 1082 1083 poly->coeff = psAlloc((nX + 1) * sizeof(psF64 ***)); 1084 poly->coeffErr = psAlloc((nX + 1) * sizeof(psF64 ***)); 1085 poly->coeffMask = (psMaskType ****)psAlloc((nX + 1) * sizeof(psMaskType ***)); 1086 for (int ix = 0; ix < (nX + 1); ix++) { 1087 poly->coeff[ix] = psAlloc((nY + 1) * sizeof(psF64 **)); 1088 poly->coeffErr[ix] = psAlloc((nY + 1) * sizeof(psF64 **)); 1089 poly->coeffMask[ix] = (psMaskType ***)psAlloc((nY + 1) * sizeof(psMaskType **)); 1090 for (int iy = 0; iy < (nY + 1); iy++) { 1091 poly->coeff[ix][iy] = psAlloc((nZ + 1) * sizeof(psF64 *)); 1092 poly->coeffErr[ix][iy] = psAlloc((nZ + 1) * sizeof(psF64 *)); 1093 poly->coeffMask[ix][iy] = (psMaskType **)psAlloc((nZ + 1) * sizeof(psMaskType *)); 1094 for (int iz = 0; iz < (nZ + 1); iz++) { 1095 poly->coeff[ix][iy][iz] = psAlloc((nT + 1) * sizeof(psF64)); 1096 poly->coeffErr[ix][iy][iz] = psAlloc((nT + 1) * sizeof(psF64)); 1097 poly->coeffMask[ix][iy][iz] = (psMaskType *)psAlloc((nT + 1) * sizeof(psMaskType)); 1098 } 1099 } 1100 } 1101 } 1102 for (int ix = 0; ix < (1 + nX); ix++) { 1103 for (int iy = 0; iy < (1 + nY); iy++) { 1104 for (int iz = 0; iz < (1 + nZ); iz++) { 1105 for (int it = 0; it < (1 + nT); it++) { 1106 poly->coeff[ix][iy][iz][it] = 0.0; 1107 poly->coeffErr[ix][iy][iz][it] = 0.0; 1108 poly->coeffMask[ix][iy][iz][it] = PS_POLY_MASK_NONE; 1109 } 1110 } 1111 } 1112 } 1113 return(true); 1114 } 1115 1116 // ######## Copy polynomials ######## 1117 psPolynomial1D *psPolynomial1DCopy(psPolynomial1D *out, 1118 psPolynomial1D *poly) 1119 { 1120 if (out == NULL) { 1121 out = psPolynomial1DAlloc (poly->type, poly->nX); 1122 } else { 1123 psPolynomial1DRecycle (out, poly->type, poly->nX); 1124 } 1125 1126 for (int i = 0; i < (1 + poly->nX); i++) { 1127 out->coeff[i] = poly->coeff[i]; 1128 out->coeffErr[i] = poly->coeffErr[i]; 1129 out->coeffMask[i] = poly->coeffMask[i]; 1130 } 1131 return(out); 1132 } 1133 psPolynomial2D *psPolynomial2DCopy(psPolynomial2D *out, 1134 psPolynomial2D *poly) 1135 { 1136 if (out == NULL) { 1137 out = psPolynomial2DAlloc (poly->type, poly->nX, poly->nY); 1138 } else { 1139 psPolynomial2DRecycle (out, poly->type, poly->nX, poly->nY); 1140 } 1141 1142 for (int i = 0; i < (1 + poly->nX); i++) { 1143 for (int j = 0; j < (1 + poly->nY); j++) { 1144 out->coeff[i][j] = poly->coeff[i][j]; 1145 out->coeffErr[i][j] = poly->coeffErr[i][j]; 1146 out->coeffMask[i][j] = poly->coeffMask[i][j]; 1147 } 1148 } 1149 return(out); 1150 } 1151 psPolynomial3D *psPolynomial3DCopy(psPolynomial3D *out, 1152 psPolynomial3D *poly) 1153 { 1154 if (out == NULL) { 1155 out = psPolynomial3DAlloc (poly->type, poly->nX, poly->nY, poly->nZ); 1156 } else { 1157 psPolynomial3DRecycle (out, poly->type, poly->nX, poly->nY, poly->nZ); 1158 } 1159 1160 for (int ix = 0; ix < (1 + poly->nX); ix++) { 1161 for (int iy = 0; iy < (1 + poly->nY); iy++) { 1162 for (int iz = 0; iz < (1 + poly->nZ); iz++) { 1163 out->coeff[ix][iy][iz] = poly->coeff[ix][iy][iz]; 1164 out->coeffErr[ix][iy][iz] = poly->coeffErr[ix][iy][iz]; 1165 out->coeffMask[ix][iy][iz] = poly->coeffMask[ix][iy][iz]; 1166 } 1167 } 1168 } 1169 return(out); 1170 } 1171 psPolynomial4D *psPolynomial4DCopy(psPolynomial4D *out, 1172 psPolynomial4D *poly) 1173 { 1174 if (out == NULL) { 1175 out = psPolynomial4DAlloc (poly->type, poly->nX, poly->nY, poly->nZ, poly->nT); 1176 } else { 1177 psPolynomial4DRecycle (out, poly->type, poly->nX, poly->nY, poly->nZ, poly->nT); 1178 } 1179 1180 for (int ix = 0; ix < (1 + poly->nX); ix++) { 1181 for (int iy = 0; iy < (1 + poly->nY); iy++) { 1182 for (int iz = 0; iz < (1 + poly->nZ); iz++) { 1183 for (int it = 0; it < (1 + poly->nT); it++) { 1184 out->coeff[ix][iy][iz][it] = poly->coeff[ix][iy][iz][it]; 1185 out->coeffErr[ix][iy][iz][it] = poly->coeffErr[ix][iy][iz][it]; 1186 out->coeffMask[ix][iy][iz][it] = poly->coeffMask[ix][iy][iz][it]; 1187 } 1188 } 1189 } 1190 } 1191 return(out); 1192 } 1193 1004 1194 /* note these functions accept unscaled values and apply the scaling saved on poly */ 1005 1195 psF64 psPolynomial1DEval(const psPolynomial1D* poly, … … 1034 1224 1035 1225 switch (x->type.type) { 1036 case PS_TYPE_F64:1226 case PS_TYPE_F64: 1037 1227 tmp = psVectorAlloc(x->n, PS_TYPE_F64); 1038 1228 for (unsigned int i=0;i<x->n;i++) { … … 1040 1230 } 1041 1231 break; 1042 case PS_TYPE_F32:1232 case PS_TYPE_F32: 1043 1233 tmp = psVectorAlloc(x->n, PS_TYPE_F32); 1044 1234 for (unsigned int i=0;i<x->n;i++) { … … 1046 1236 } 1047 1237 break; 1048 default:1238 default: 1049 1239 psError(PS_ERR_UNKNOWN, false, "invalid input data type.\n"); 1050 1240 return (NULL);
Note:
See TracChangeset
for help on using the changeset viewer.
