Path: blob/master/thirdparty/cvtt/ConvectionKernels_PackedCovarianceMatrix.h
9896 views
#pragma once1#ifndef __CVTT_COVARIANCEMATRIX_H__2#define __CVTT_COVARIANCEMATRIX_H__34namespace cvtt5{6namespace Internal7{89template<int TMatrixSize>10class PackedCovarianceMatrix11{12public:13// 0: xx,14// 1: xy, yy15// 3: xz, yz, zz16// 6: xw, yw, zw, ww17// ... etc.18static const int PyramidSize = (TMatrixSize * (TMatrixSize + 1)) / 2;1920typedef ParallelMath::Float MFloat;2122PackedCovarianceMatrix()23{24for (int i = 0; i < PyramidSize; i++)25m_values[i] = ParallelMath::MakeFloatZero();26}2728void Add(const ParallelMath::Float *vec, const ParallelMath::Float &weight)29{30int index = 0;31for (int row = 0; row < TMatrixSize; row++)32{33for (int col = 0; col <= row; col++)34{35m_values[index] = m_values[index] + vec[row] * vec[col] * weight;36index++;37}38}39}4041void Product(MFloat *outVec, const MFloat *inVec)42{43for (int row = 0; row < TMatrixSize; row++)44{45MFloat sum = ParallelMath::MakeFloatZero();4647int index = (row * (row + 1)) >> 1;48for (int col = 0; col < TMatrixSize; col++)49{50sum = sum + inVec[col] * m_values[index];51if (col >= row)52index += col + 1;53else54index++;55}5657outVec[row] = sum;58}59}6061private:62ParallelMath::Float m_values[PyramidSize];63};64}65}6667#endif686970