Changeset 10001
- Timestamp:
- Nov 14, 2006, 6:09:23 PM (19 years ago)
- Location:
- trunk/psLib/src/math
- Files:
-
- 2 edited
-
psSparse.c (modified) (1 diff)
-
psSparse.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psSparse.c
r9995 r10001 229 229 } 230 230 231 // allocate a sparse matrix container for Nrows, with Nelem slots allocated 232 psSparseBorder *psSparseBorderAlloc (int Nrows, int Nelem) 233 { 234 psSparseBorder *sparse = (psSparseBorder *)psAlloc(sizeof(psSparseBorder)); 235 psMemSetDeallocator(sparse, (psFreeFunc) psSparseBorderFree); 236 237 sparse->Nrows = Nrows; 238 sparse->Nelem = Nelem; 239 240 sparse->Bij = psImageAlloc(Nelem, Nrows, PS_DATA_F32); 241 psInitImage (sparse->Bij, 0.0); 242 243 sparse->Qii = psImageAlloc(Nrows, Nrows, PS_DATA_F32); 244 psInitImage (sparse->Qii, 0.0); 245 246 return sparse; 247 } 248 249 // add elements to sparse->Qii 250 bool psSparseBorderMatrixElement(psSparseBorder *sparse, int i, int j, float value) 251 { 252 PS_ASSERT_PTR_NON_NULL(sparse, false); 253 PS_ASSERT_PTR_NON_NULL(sparse->Qii, false); 231 // allocate a sparse matrix border container for a system with Nrows + Nborder elements 232 // the supplied psSparse has a size of Nrows 233 psSparseBorder *psSparseBorderAlloc(psSparse *sparse, int Nborder) 234 { 235 psSparseBorder *border = (psSparseBorder *)psAlloc(sizeof(psSparseBorder)); 236 psMemSetDeallocator(border, (psFreeFunc) psSparseBorderFree); 237 238 int Nrows = sparse->Nrows; 239 border->Nrows = Nrows; 240 border->Nborder = Nborder; 241 242 border->Bij = psImageAlloc(Nrows, Nborder, PS_DATA_F32); 243 psImageInit (border->Bij, 0.0); 244 245 border->Qii = psImageAlloc(Nborder, Nborder, PS_DATA_F32); 246 psImageInit (border->Qii, 0.0); 247 248 border->Yi = psVectorAlloc(Nborder, PS_DATA_F32); 249 psVectorInit (border->Yi, 0.0); 250 251 border->Gi = psVectorAlloc(Nborder, PS_DATA_F32); 252 psVectorInit (border->Gi, 0.0); 253 254 return border; 255 } 256 257 // add elements to border->Qii 258 bool psSparseBorderElementQ(psSparseBorder *border, int i, int j, float value) 259 { 260 PS_ASSERT_PTR_NON_NULL(border, false); 261 PS_ASSERT_PTR_NON_NULL(border->Qii, false); 254 262 PS_ASSERT_INT_NONNEGATIVE(i, false); 255 263 PS_ASSERT_INT_NONNEGATIVE(j, false); 256 264 257 // check i,j against sparse->Qii->nX,nY258 sparse->Qii->data.F32[i][j] = value;259 return true; 260 } 261 262 // add elements to sparse->Bij263 bool psSparseBorder VectorElement(psSparseBorder *sparse, int i, int j, float value)264 { 265 PS_ASSERT_PTR_NON_NULL( sparse, false);266 PS_ASSERT_PTR_NON_NULL( sparse->Qii, false);265 // check i,j against border->Qii->nX,nY 266 border->Qii->data.F32[i][j] = value; 267 return true; 268 } 269 270 // add elements to border->Bij 271 bool psSparseBorderElementB(psSparseBorder *border, int i, int j, float value) 272 { 273 PS_ASSERT_PTR_NON_NULL(border, false); 274 PS_ASSERT_PTR_NON_NULL(border->Bij, false); 267 275 PS_ASSERT_INT_NONNEGATIVE(i, false); 268 276 PS_ASSERT_INT_NONNEGATIVE(j, false); 269 277 270 sparse->Bij->data.F32[i][j] = value; 278 border->Bij->data.F32[i][j] = value; 279 return true; 280 } 281 282 // add elements to border->Yi 283 bool psSparseBorderElementY(psSparseBorder *border, int i, float value) 284 { 285 PS_ASSERT_PTR_NON_NULL(border, false); 286 PS_ASSERT_PTR_NON_NULL(border->Yi, false); 287 PS_ASSERT_INT_NONNEGATIVE(i, false); 288 289 border->Yi->data.F32[i] = value; 290 return true; 291 } 292 293 // add elements to border->Gi 294 bool psSparseBorderElementY(psSparseBorder *border, int i, float value) 295 { 296 PS_ASSERT_PTR_NON_NULL(border, false); 297 PS_ASSERT_PTR_NON_NULL(border->Gi, false); 298 PS_ASSERT_INT_NONNEGATIVE(i, false); 299 300 border->Gi->data.F32[i] = value; 301 return true; 302 } 303 304 // perform the operation dG = B*x 305 psVector *psSparseBorderUpperProduct (psSparse *border) 306 { 307 308 int Nborder = border->Nborder; 309 int Nrow = border->Nrows; 310 311 psVector *dG = psVectorAlloc (Nborder, PS_DATA_F32); 312 psVectorInit (dG, 0.0); 313 314 for (int j = 0; j < Nborder; j++) { 315 double value = 0; 316 for (int i = 0; i < Nrows; i++) { 317 value += border->Bij->data.F32[i][j] * x->data.F32[i]; 318 } 319 dG->data.F32[j] = value; 320 } 321 322 return dG; 323 } 324 325 // perform the operation dF = B^T*y 326 psVector *psSparseBorderLowerProduct (psSparse *border) 327 { 328 329 int Nborder = border->Nborder; 330 int Nrow = border->Nrows; 331 332 psVector *dF = psVectorAlloc (Nrows, PS_DATA_F32); 333 psVectorInit (dF, 0.0); 334 335 for (int i = 0; i < Nrows; i++) { 336 double value = 0; 337 for (int j = 0; j < Nborder; j++) { 338 value += border->Bij->data.F32[i][j] * border->Yi->data.F32[j]; 339 } 340 dF->data.F32[i] = value; 341 } 342 343 return dF; 344 } 345 346 // perform the operation dF = B^T*y 347 psVector *psSparseBorderUpperDelta (psSparse *border, psVector *dF) 348 { 349 350 int Nborder = border->Nborder; 351 int Nrow = border->Nrows; 352 353 for (int i = 0; i < Nrows; i++) { 354 border->sparse->Bfj->data.F32[i] -= dF->data.F32[i]; 355 } 356 357 return true; 358 } 359 360 // perform the operation dF = B^T*y 361 psVector *psSparseBorderLowerDelta (psSparse *border, psVector *dG) 362 { 363 364 int Nborder = border->Nborder; 365 int Nrow = border->Nrows; 366 367 for (int i = 0; i < Nborder; i++) { 368 border->Gi->data.F32[i] -= dG->data.F32[i]; 369 } 370 271 371 return true; 272 372 } -
trunk/psLib/src/math/psSparse.h
r9991 r10001 71 71 typedef struct 72 72 { 73 psImage *Bij; // Aij contains the populated elements of the matrix 74 psImage *Qii; // Bfj contains the elements of the vector Bf 75 int Nelem; // Number of elements (long dimension of Bij, 0-j) 76 int Nrows; // Number of rows (size of Qii) 73 psSparse *sparse; // corresponding sparse matrix equation 74 psImage *Bij; // Aij contains the populated elements of the matrix 75 psImage *Qii; // Bfj contains the elements of the vector Bf 76 psVector *Yi; // lower independent var 77 psVector *Gi; // lower dependent var 78 int Nrows; // Number of rows (long dimension of Bij, 0-j) 79 int Nborder; // Number of border elements (size of Qii) 77 80 } 78 81 psSparseBorder; … … 80 83 81 84 // allocate a sparse matrix structure 82 psSparse *psSparseBorderAlloc(int Nrows, int Nelem);85 psSparseBorder *psSparseBorderAlloc(psSparse *sparse, int Nborder); 83 86 84 87 // add a new matrix element
Note:
See TracChangeset
for help on using the changeset viewer.
