21 #ifndef __otbStreamingMatrixTransposeMatrixImageFilter_txx
22 #define __otbStreamingMatrixTransposeMatrixImageFilter_txx
28 #include "itkNumericTraits.h"
34 template<
class TInputImage,
class TInputImage2>
38 this->SetNumberOfRequiredInputs(2);
46 typename ImageType::Pointer output1 =
static_cast<ImageType*
>(this->MakeOutput(0).GetPointer());
52 m_UsePadFirstInput =
false;
53 m_UsePadSecondInput =
false;
56 m_NumberOfComponents1 = 0;
57 m_NumberOfComponents2 = 0;
60 template<
class TInputImage,
class TInputImage2>
71 return static_cast<itk::DataObject*
>(MatrixObjectType::New().GetPointer());
80 template<
class TInputImage,
class TInputImage2>
88 template<
class TInputImage,
class TInputImage2>
96 template<
class TInputImage,
class TInputImage2>
101 Superclass::GenerateInputRequestedRegion();
103 if (this->GetFirstInput() && this->GetSecondInput())
107 image->SetRequestedRegion(this->GetOutput()->GetRequestedRegion());
108 image2->SetRequestedRegion(this->GetOutput()->GetRequestedRegion());
111 template<
class TInputImage,
class TInputImage2>
116 Superclass::GenerateOutputInformation();
117 if (this->GetFirstInput())
119 this->GetOutput()->CopyInformation(this->GetFirstInput());
120 this->GetOutput()->SetLargestPossibleRegion(this->GetFirstInput()->GetLargestPossibleRegion());
123 if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
125 this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
129 template<
class TInputImage,
class TInputImage2>
141 template<
class TInputImage,
class TInputImage2>
147 TInputImage * inputPtr1 =
const_cast<TInputImage *
>(this->GetFirstInput());
148 inputPtr1->UpdateOutputInformation();
149 TInputImage2 * inputPtr2 =
const_cast<TInputImage2 *
>(this->GetSecondInput());
150 inputPtr2->UpdateOutputInformation();
152 if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
154 this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
157 if (inputPtr1->GetLargestPossibleRegion().GetSize() != inputPtr2->GetLargestPossibleRegion().GetSize())
159 itkExceptionMacro(<<
" Can't multiply the transposed matrix of a "
160 << inputPtr1->GetLargestPossibleRegion().GetSize()
162 << inputPtr2->GetLargestPossibleRegion().GetSize()
166 m_NumberOfComponents1 = inputPtr1->GetNumberOfComponentsPerPixel();
167 m_NumberOfComponents2 = inputPtr2->GetNumberOfComponentsPerPixel();
168 unsigned int numberOfThreads = this->GetNumberOfThreads();
170 if (m_UsePadFirstInput ==
true)
172 m_NumberOfComponents1++;
174 if (m_UsePadSecondInput ==
true)
176 m_NumberOfComponents2++;
180 tempMatrix.
SetSize(m_NumberOfComponents1, m_NumberOfComponents2);
181 tempMatrix.
Fill(itk::NumericTraits<RealType>::Zero);
184 initMatrix.
SetSize(m_NumberOfComponents2, m_NumberOfComponents2);
185 initMatrix.
Fill(itk::NumericTraits<RealType>::Zero);
186 this->GetResultOutput()->Set(initMatrix);
189 template<
class TInputImage,
class TInputImage2>
194 unsigned int numberOfThreads = this->GetNumberOfThreads();
196 resultMatrix.
SetSize(m_NumberOfComponents1, m_NumberOfComponents2);
197 resultMatrix.
Fill(itk::NumericTraits<RealType>::Zero);
199 for (
unsigned int thread = 0; thread < numberOfThreads; thread++)
205 for (
unsigned int i = 0; i < resultMatrix.
Rows(); ++i)
207 for (
unsigned int j = 0; j < resultMatrix.
Cols(); ++j)
209 resultMatrix(i, j) += m_ThreadSum[thread](i, j);
214 this->GetResultOutput()->Set(resultMatrix);
217 template<
class TInputImage,
class TInputImage2>
226 InputImagePointer input2Ptr =
const_cast<TInputImage2 *
>(this->GetSecondInput());
230 input1Ptr->SetRequestedRegion(outputRegionForThread);
231 input2Ptr->SetRequestedRegion(outputRegionForThread);
232 input1Ptr->PropagateRequestedRegion();
233 input1Ptr->UpdateOutputData();
234 input2Ptr->PropagateRequestedRegion();
235 input2Ptr->UpdateOutputData();
249 if (m_UsePadFirstInput ==
true)
251 PixelType vectortemp1(vectorValue1.Size() + 1);
253 for (
unsigned int n = 0; n < vectorValue1.Size(); ++n)
255 vectortemp1[n + 1] = vectorValue1[n];
258 vectorValue1.SetSize(vectortemp1.Size());
259 vectorValue1 = vectortemp1;
262 if (m_UsePadSecondInput ==
true)
264 PixelType2 vectortemp2(vectorValue2.Size() + 1);
266 for (
unsigned int m = 0; m < vectorValue2.Size(); m++)
268 vectortemp2[m + 1] = vectorValue2[m];
271 vectorValue2.SetSize(vectortemp2.Size());
272 vectorValue2 = vectortemp2;
275 for (
unsigned int i = 0; i < vectorValue1.Size(); ++i)
277 for (
unsigned int j = 0; j < vectorValue2.Size(); ++j)
279 m_ThreadSum[threadId](i, j) += static_cast<RealType>(vectorValue1[i]) *
static_cast<RealType>(vectorValue2[j]);
285 progress.CompletedPixel();
289 template<
class TInputImage,
class TInputImage2>
294 Superclass::PrintSelf(os, indent);
296 os << indent <<
"Result: " << this->GetResultOutput()->Get() << std::endl;