22 #ifndef _vctDynamicMatrixLoopEngines_h
23 #define _vctDynamicMatrixLoopEngines_h
46 cmnThrow(std::runtime_error(
"vctDynamicMatrixLoopEngines: Sizes of matrices don't match"));
53 cmnThrow(std::runtime_error(
"vctDynamicMatrixLoopEngines: Output base pointer is same as one of input base pointers."));
88 template<
class _elementOperationType>
91 template<
class _outputMatrixType,
class _input1MatrixType,
class _input2MatrixType>
92 static void Run(_outputMatrixType & outputMatrix,
93 const _input1MatrixType & input1Matrix,
94 const _input2MatrixType & input2Matrix)
96 typedef _outputMatrixType OutputMatrixType;
97 typedef typename OutputMatrixType::OwnerType OutputOwnerType;
100 typedef typename OutputOwnerType::pointer OutputPointerType;
102 typedef _input1MatrixType Input1MatrixType;
103 typedef typename Input1MatrixType::OwnerType Input1OwnerType;
104 typedef typename Input1OwnerType::const_pointer Input1PointerType;
106 typedef _input2MatrixType Input2MatrixType;
107 typedef typename Input2MatrixType::OwnerType Input2OwnerType;
108 typedef typename Input2OwnerType::const_pointer Input2PointerType;
111 OutputOwnerType & outputOwner = outputMatrix.Owner();
112 const Input1OwnerType & input1Owner = input1Matrix.Owner();
113 const Input2OwnerType & input2Owner = input2Matrix.Owner();
115 const size_type rows = outputOwner.rows();
116 const size_type cols = outputOwner.cols();
119 if ((rows != input1Owner.rows())
120 || (cols != input1Owner.cols())
121 || (rows != input2Owner.rows())
122 || (cols != input2Owner.cols()))
128 if (outputOwner.IsCompact() && input1Owner.IsCompact() && input2Owner.IsCompact()
129 && (outputOwner.strides() == input1Owner.strides())
130 && (outputOwner.strides() == input2Owner.strides())) {
133 const stride_type outputColStride = outputOwner.col_stride();
134 const stride_type outputRowStride = outputOwner.row_stride();
135 const stride_type outputStrideToNextRow = outputRowStride - cols * outputColStride;
137 const stride_type input1ColStride = input1Owner.col_stride();
138 const stride_type input1RowStride = input1Owner.row_stride();
139 const stride_type input1StrideToNextRow = input1RowStride - cols * input1ColStride;
141 const stride_type input2ColStride = input2Owner.col_stride();
142 const stride_type input2RowStride = input2Owner.row_stride();
143 const stride_type input2StrideToNextRow = input2RowStride - cols * input2ColStride;
145 OutputPointerType outputPointer = outputOwner.Pointer();
146 const OutputPointerType outputRowEnd = outputPointer + rows * outputRowStride;
147 OutputPointerType outputColEnd = outputPointer + cols * outputColStride;
149 Input1PointerType input1Pointer = input1Owner.Pointer();
150 Input2PointerType input2Pointer = input2Owner.Pointer();
153 outputPointer != outputRowEnd;
154 outputPointer += outputStrideToNextRow, input1Pointer += input1StrideToNextRow, input2Pointer += input2StrideToNextRow,
155 outputColEnd += outputRowStride) {
157 outputPointer != outputColEnd;
158 outputPointer += outputColStride, input1Pointer += input1ColStride, input2Pointer += input2ColStride) {
159 *outputPointer = _elementOperationType::Operate(*input1Pointer, *input2Pointer);
167 template<
class _elementOperationType>
170 template<
class _outputMatrixType,
class _inputMatrixType>
171 static inline void Run(_outputMatrixType & outputMatrix,
172 const _inputMatrixType & inputMatrix)
174 typedef _outputMatrixType OutputMatrixType;
175 typedef typename OutputMatrixType::OwnerType OutputOwnerType;
178 typedef typename OutputOwnerType::pointer OutputPointerType;
180 typedef _inputMatrixType InputMatrixType;
181 typedef typename InputMatrixType::OwnerType InputOwnerType;
182 typedef typename InputOwnerType::const_pointer InputPointerType;
185 const InputOwnerType & inputOwner = inputMatrix.Owner();
186 OutputOwnerType & outputOwner = outputMatrix.Owner();
188 const size_type rows = outputMatrix.rows();
189 const size_type cols = outputMatrix.cols();
192 if ((rows != inputOwner.rows()) || (cols != inputOwner.cols())) {
197 if (outputOwner.IsCompact() && inputOwner.IsCompact()
198 && (outputOwner.strides() == inputOwner.strides())) {
202 const stride_type outputColStride = outputOwner.col_stride();
203 const stride_type outputRowStride = outputOwner.row_stride();
204 const stride_type outputStrideToNextRow = outputRowStride - cols * outputColStride;
206 const stride_type inputColStride = inputOwner.col_stride();
207 const stride_type inputRowStride = inputOwner.row_stride();
208 const stride_type inputStrideToNextRow = inputRowStride - cols * inputColStride;
210 OutputPointerType outputPointer = outputOwner.Pointer();
211 const OutputPointerType outputRowEnd = outputPointer + rows * outputRowStride;
212 OutputPointerType outputColEnd = outputPointer + cols * outputColStride;
214 InputPointerType inputPointer = inputOwner.Pointer();
217 outputPointer != outputRowEnd;
218 outputPointer += outputStrideToNextRow, inputPointer += inputStrideToNextRow,
219 outputColEnd += outputRowStride) {
221 outputPointer != outputColEnd;
222 outputPointer += outputColStride, inputPointer += inputColStride) {
223 *outputPointer = _elementOperationType::Operate(*inputPointer);
231 template<
class _elementOperationType>
234 template<
class _inputOutputMatrixType>
235 static inline void Run(_inputOutputMatrixType & inputOutputMatrix)
237 typedef _inputOutputMatrixType InputOutputMatrixType;
238 typedef typename InputOutputMatrixType::OwnerType InputOutputOwnerType;
241 typedef typename InputOutputOwnerType::pointer PointerType;
244 InputOutputOwnerType & inputOutputOwner = inputOutputMatrix.Owner();
247 if (inputOutputOwner.IsCompact()) {
250 const size_type rows = inputOutputOwner.rows();
251 const size_type cols = inputOutputOwner.cols();
253 const stride_type colStride = inputOutputOwner.col_stride();
254 const stride_type rowStride = inputOutputOwner.row_stride();
255 const stride_type strideToNextRow = rowStride - cols * colStride;
257 PointerType inputOutputPointer = inputOutputOwner.Pointer();
258 const PointerType rowEnd = inputOutputPointer + rows * rowStride;
259 PointerType colEnd = inputOutputPointer + cols * colStride;
262 inputOutputPointer != rowEnd;
263 inputOutputPointer += strideToNextRow, colEnd += rowStride) {
265 inputOutputPointer != colEnd;
266 inputOutputPointer += colStride) {
267 _elementOperationType::Operate(*inputOutputPointer);
275 template<
class _elementOperationType>
278 template<
class _inputOutputMatrixType,
class _inputMatrixType>
279 static inline void Run(_inputOutputMatrixType & inputOutputMatrix,
280 const _inputMatrixType & inputMatrix)
282 typedef _inputOutputMatrixType InputOutputMatrixType;
283 typedef typename InputOutputMatrixType::OwnerType InputOutputOwnerType;
286 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
288 typedef _inputMatrixType InputMatrixType;
289 typedef typename InputMatrixType::OwnerType InputOwnerType;
290 typedef typename InputOwnerType::const_pointer InputPointerType;
293 InputOutputOwnerType & inputOutputOwner = inputOutputMatrix.Owner();
294 const InputOwnerType & inputOwner = inputMatrix.Owner();
296 const size_type rows = inputOutputOwner.rows();
297 const size_type cols = inputOutputOwner.cols();
300 if ((rows != inputOwner.rows()) || (cols != inputOwner.cols()))
306 if (inputOutputOwner.IsCompact() && inputOwner.IsCompact()
307 && (inputOutputOwner.strides() == inputOwner.strides())) {
310 const stride_type inputOutputColStride = inputOutputOwner.col_stride();
311 const stride_type inputOutputRowStride = inputOutputOwner.row_stride();
312 const stride_type inputOutputStrideToNextRow = inputOutputRowStride - cols * inputOutputColStride;
314 const stride_type inputColStride = inputOwner.col_stride();
315 const stride_type inputRowStride = inputOwner.row_stride();
316 const stride_type inputStrideToNextRow = inputRowStride - cols * inputColStride;
318 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
319 const InputOutputPointerType inputOutputRowEnd = inputOutputPointer + rows * inputOutputRowStride;
320 InputOutputPointerType inputOutputColEnd = inputOutputPointer + cols * inputOutputColStride;
322 InputPointerType inputPointer = inputOwner.Pointer();
325 inputOutputPointer != inputOutputRowEnd;
326 inputOutputPointer += inputOutputStrideToNextRow, inputPointer += inputStrideToNextRow,
327 inputOutputColEnd += inputOutputRowStride) {
329 inputOutputPointer != inputOutputColEnd;
330 inputOutputPointer += inputOutputColStride, inputPointer += inputColStride) {
331 _elementOperationType::Operate(*inputOutputPointer, *inputPointer);
339 template<
class _elementOperationType>
342 template<
class _outputMatrixType,
class _inputMatrixType,
class _inputScalarType>
343 static void Run(_outputMatrixType & outputMatrix,
344 const _inputMatrixType & inputMatrix,
345 const _inputScalarType inputScalar)
347 typedef _outputMatrixType OutputMatrixType;
348 typedef typename OutputMatrixType::OwnerType OutputOwnerType;
351 typedef typename OutputOwnerType::pointer OutputPointerType;
353 typedef _inputMatrixType InputMatrixType;
354 typedef typename InputMatrixType::OwnerType InputOwnerType;
355 typedef typename InputOwnerType::const_pointer InputPointerType;
358 OutputOwnerType & outputOwner = outputMatrix.Owner();
359 const InputOwnerType & inputOwner = inputMatrix.Owner();
361 const size_type rows = outputOwner.rows();
362 const size_type cols = outputOwner.cols();
365 if ((rows != inputOwner.rows()) || (cols != inputOwner.cols()))
371 if (outputOwner.IsCompact() && inputOwner.IsCompact()
372 && (outputOwner.strides() == inputOwner.strides())) {
376 const stride_type outputColStride = outputOwner.col_stride();
377 const stride_type outputRowStride = outputOwner.row_stride();
378 const stride_type outputStrideToNextRow = outputRowStride - cols * outputColStride;
380 const stride_type inputColStride = inputOwner.col_stride();
381 const stride_type inputRowStride = inputOwner.row_stride();
382 const stride_type inputStrideToNextRow = inputRowStride - cols * inputColStride;
384 OutputPointerType outputPointer = outputOwner.Pointer();
385 const OutputPointerType outputRowEnd = outputPointer + rows * outputRowStride;
386 OutputPointerType outputColEnd = outputPointer + cols * outputColStride;
388 InputPointerType inputPointer = inputOwner.Pointer();
391 outputPointer != outputRowEnd;
392 outputPointer += outputStrideToNextRow, inputPointer += inputStrideToNextRow,
393 outputColEnd += outputRowStride) {
395 outputPointer != outputColEnd;
396 outputPointer += outputColStride, inputPointer += inputColStride) {
397 *outputPointer = _elementOperationType::Operate(*inputPointer, inputScalar);
405 template<
class _elementOperationType>
408 template<
class _outputMatrixType,
class _inputScalarType,
class _inputMatrixType>
409 static void Run(_outputMatrixType & outputMatrix,
410 const _inputScalarType inputScalar,
411 const _inputMatrixType & inputMatrix)
413 typedef _outputMatrixType OutputMatrixType;
414 typedef typename OutputMatrixType::OwnerType OutputOwnerType;
417 typedef typename OutputOwnerType::pointer OutputPointerType;
419 typedef _inputMatrixType InputMatrixType;
420 typedef typename InputMatrixType::OwnerType InputOwnerType;
421 typedef typename InputOwnerType::const_pointer InputPointerType;
424 OutputOwnerType & outputOwner = outputMatrix.Owner();
425 const InputOwnerType & inputOwner = inputMatrix.Owner();
427 const size_type rows = outputOwner.rows();
428 const size_type cols = outputOwner.cols();
431 if ((rows != inputOwner.rows()) || (cols != inputOwner.cols()))
437 if (outputOwner.IsCompact() && inputOwner.IsCompact()
438 && (outputOwner.strides() == inputOwner.strides())) {
442 const stride_type outputColStride = outputOwner.col_stride();
443 const stride_type outputRowStride = outputOwner.row_stride();
444 const stride_type outputStrideToNextRow = outputRowStride - cols * outputColStride;
446 const stride_type inputColStride = inputOwner.col_stride();
447 const stride_type inputRowStride = inputOwner.row_stride();
448 const stride_type inputStrideToNextRow = inputRowStride - cols * inputColStride;
450 OutputPointerType outputPointer = outputOwner.Pointer();
451 const OutputPointerType outputRowEnd = outputPointer + rows * outputRowStride;
452 OutputPointerType outputColEnd = outputPointer + cols * outputColStride;
454 InputPointerType inputPointer = inputOwner.Pointer();
457 outputPointer != outputRowEnd;
458 outputPointer += outputStrideToNextRow, inputPointer += inputStrideToNextRow,
459 outputColEnd += outputRowStride) {
461 outputPointer != outputColEnd;
462 outputPointer += outputColStride, inputPointer += inputColStride) {
463 *outputPointer = _elementOperationType::Operate(inputScalar, *inputPointer);
471 template<
class _elementOperationType>
474 template<
class _inputOutputMatrixType,
class _inputScalarType>
475 static void Run(_inputOutputMatrixType & inputOutputMatrix,
476 const _inputScalarType inputScalar)
478 typedef _inputOutputMatrixType InputOutputMatrixType;
479 typedef typename InputOutputMatrixType::OwnerType InputOutputOwnerType;
482 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
485 InputOutputOwnerType & inputOutputOwner = inputOutputMatrix.Owner();
487 if (inputOutputOwner.IsCompact()) {
490 const size_type rows = inputOutputOwner.rows();
491 const size_type cols = inputOutputOwner.cols();
493 const stride_type colStride = inputOutputOwner.col_stride();
494 const stride_type rowStride = inputOutputOwner.row_stride();
495 const stride_type strideToNextRow = rowStride - cols * colStride;
497 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
498 const InputOutputPointerType rowEnd = inputOutputPointer + rows * rowStride;
499 InputOutputPointerType colEnd = inputOutputPointer + cols * colStride;
502 inputOutputPointer != rowEnd;
503 inputOutputPointer += strideToNextRow, colEnd += rowStride) {
505 inputOutputPointer != colEnd;
506 inputOutputPointer += colStride) {
507 _elementOperationType::Operate(*inputOutputPointer, inputScalar);
515 template<
class _incrementalOperationType,
class _elementOperationType>
518 typedef typename _incrementalOperationType::OutputType
OutputType;
520 template<
class _inputMatrixType>
523 typedef _inputMatrixType InputMatrixType;
524 typedef typename InputMatrixType::OwnerType InputOwnerType;
527 typedef typename InputOwnerType::const_pointer InputPointerType;
530 const InputOwnerType & inputOwner = inputMatrix.Owner();
532 if (inputOwner.IsCompact()) {
536 const size_type rows = inputOwner.rows();
537 const size_type cols = inputOwner.cols();
539 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
541 const stride_type inputColStride = inputOwner.col_stride();
542 const stride_type inputRowStride = inputOwner.row_stride();
543 const stride_type inputStrideToNextRow = inputRowStride - cols * inputColStride;
544 InputPointerType inputPointer = inputOwner.Pointer();
545 const InputPointerType inputRowEnd = inputPointer + rows * inputRowStride;
546 InputPointerType inputColEnd = inputPointer + cols * inputColStride;
549 inputPointer != inputRowEnd;
550 inputPointer += inputStrideToNextRow, inputColEnd += inputRowStride) {
552 inputPointer != inputColEnd;
553 inputPointer += inputColStride) {
554 incrementalResult = _incrementalOperationType::Operate(
555 incrementalResult, _elementOperationType::Operate(*inputPointer) );
558 return incrementalResult;
564 template<
class _incrementalOperationType,
class _elementOperationType>
567 typedef typename _incrementalOperationType::OutputType
OutputType;
569 template<
class _input1MatrixType,
class _input2MatrixType>
571 const _input2MatrixType & input2Matrix) {
572 typedef _input1MatrixType Input1MatrixType;
573 typedef typename Input1MatrixType::OwnerType Input1OwnerType;
576 typedef typename Input1OwnerType::const_pointer Input1PointerType;
578 typedef _input2MatrixType Input2MatrixType;
579 typedef typename Input2MatrixType::OwnerType Input2OwnerType;
580 typedef typename Input2OwnerType::const_pointer Input2PointerType;
583 const Input1OwnerType & input1Owner = input1Matrix.Owner();
584 const Input2OwnerType & input2Owner = input2Matrix.Owner();
586 const size_type rows = input1Owner.rows();
587 const size_type cols = input1Owner.cols();
590 if ((rows != input2Owner.rows()) || (cols != input2Owner.cols())) {
595 if (input1Owner.IsCompact() && input2Owner.IsCompact()
596 && (input1Owner.strides() == input2Owner.strides())) {
600 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
601 const stride_type input1ColStride = input1Owner.col_stride();
602 const stride_type input1RowStride = input1Owner.row_stride();
603 const stride_type input1StrideToNextRow = input1RowStride - cols * input1ColStride;
605 const stride_type input2ColStride = input2Owner.col_stride();
606 const stride_type input2RowStride = input2Owner.row_stride();
607 const stride_type input2StrideToNextRow = input2RowStride - cols * input2ColStride;
609 Input1PointerType input1Pointer = input1Owner.Pointer();
610 const Input1PointerType input1RowEnd = input1Pointer + rows * input1RowStride;
611 Input1PointerType input1ColEnd = input1Pointer + cols * input1ColStride;
613 Input2PointerType input2Pointer = input2Owner.Pointer();
616 input1Pointer != input1RowEnd;
617 input1Pointer += input1StrideToNextRow, input2Pointer += input2StrideToNextRow,
618 input1ColEnd += input1RowStride) {
620 input1Pointer != input1ColEnd;
621 input1Pointer += input1ColStride, input2Pointer += input2ColStride) {
622 incrementalResult = _incrementalOperationType::Operate(incrementalResult,
623 _elementOperationType::Operate(*input1Pointer, *input2Pointer) );
626 return incrementalResult;
657 template<
class _ioElementOperationType,
class _scalarMatrixElementOperationType>
662 template<
class _ioMatrixType,
class _inputScalarType,
class _inputMatrixType>
663 static inline void Run(_ioMatrixType & ioMatrix,
664 const _inputScalarType & inputScalar,
665 const _inputMatrixType & inputMatrix)
667 typedef _ioMatrixType IoMatrixType;
668 typedef typename IoMatrixType::OwnerType IoOwnerType;
671 typedef typename IoOwnerType::pointer IoPointerType;
673 typedef _inputMatrixType InputMatrixType;
674 typedef typename InputMatrixType::OwnerType InputOwnerType;
675 typedef typename InputOwnerType::const_pointer InputPointerType;
678 IoOwnerType & ioOwner = ioMatrix.Owner();
679 const InputOwnerType & inputOwner = inputMatrix.Owner();
681 const size_type rows = ioOwner.rows();
682 const size_type cols = ioOwner.cols();
685 if ((rows != inputOwner.rows()) || (cols != inputOwner.cols())) {
690 if (ioOwner.IsCompact() && inputOwner.IsCompact()
691 && (ioOwner.strides() == inputOwner.strides())) {
695 const stride_type ioColStride = ioOwner.col_stride();
696 const stride_type ioRowStride = ioOwner.row_stride();
697 const stride_type ioStrideToNextRow = ioRowStride - cols * ioColStride;
699 const stride_type inputColStride = inputOwner.col_stride();
700 const stride_type inputRowStride = inputOwner.row_stride();
701 const stride_type inputStrideToNextRow = inputRowStride - cols * inputColStride;
703 IoPointerType ioPointer = ioOwner.Pointer();
704 InputPointerType inputPointer = inputOwner.Pointer();
706 size_type rowIndex, colIndex;
709 ++rowIndex, ioPointer += ioStrideToNextRow, inputPointer += inputStrideToNextRow) {
712 ++colIndex, ioPointer += ioColStride, inputPointer += inputColStride) {
713 _ioElementOperationType::Operate(*ioPointer,
714 _scalarMatrixElementOperationType::Operate(inputScalar, *inputPointer));
748 template<
class _ioElementOperationType,
class _matrixElementOperationType>
753 template<
class _ioMatrixType,
class _input1MatrixType,
class _input2MatrixType>
754 static inline void Run(_ioMatrixType & ioMatrix,
755 const _input1MatrixType & input1Matrix,
756 const _input2MatrixType & input2Matrix)
758 typedef _ioMatrixType IoMatrixType;
759 typedef typename IoMatrixType::OwnerType IoOwnerType;
762 typedef typename IoOwnerType::pointer IoPointerType;
764 typedef _input1MatrixType Input1MatrixType;
765 typedef typename Input1MatrixType::OwnerType Input1OwnerType;
766 typedef typename Input1OwnerType::const_pointer Input1PointerType;
768 typedef _input2MatrixType Input2MatrixType;
769 typedef typename Input2MatrixType::OwnerType Input2OwnerType;
770 typedef typename Input2OwnerType::const_pointer Input2PointerType;
773 IoOwnerType & ioOwner = ioMatrix.Owner();
774 const Input1OwnerType & input1Owner = input1Matrix.Owner();
775 const Input2OwnerType & input2Owner = input2Matrix.Owner();
777 const size_type rows = ioOwner.rows();
778 const size_type cols = ioOwner.cols();
781 if ((rows != input1Owner.rows()) || (cols != input1Owner.cols())
782 || (rows != input2Owner.rows()) || (cols != input2Owner.cols())
788 if (ioOwner.IsCompact() && input1Owner.IsCompact() && input2Owner.IsCompact()
789 && (ioOwner.strides() == input1Owner.strides())
790 && (ioOwner.strides() == input2Owner.strides())) {
794 const stride_type ioColStride = ioOwner.col_stride();
795 const stride_type ioRowStride = ioOwner.row_stride();
796 const stride_type ioStrideToNextRow = ioRowStride - cols * ioColStride;
798 const stride_type input1ColStride = input1Owner.col_stride();
799 const stride_type input1RowStride = input1Owner.row_stride();
800 const stride_type input1StrideToNextRow = input1RowStride - cols * input1ColStride;
802 const stride_type input2ColStride = input2Owner.col_stride();
803 const stride_type input2RowStride = input2Owner.row_stride();
804 const stride_type input2StrideToNextRow = input2RowStride - cols * input2ColStride;
806 IoPointerType ioPointer = ioOwner.Pointer();
807 Input1PointerType input1Pointer = input1Owner.Pointer();
808 Input2PointerType input2Pointer = input2Owner.Pointer();
810 size_type rowIndex, colIndex;
813 ++rowIndex, ioPointer += ioStrideToNextRow,
814 input1Pointer += input1StrideToNextRow,
815 input2Pointer += input2StrideToNextRow) {
818 ++colIndex, ioPointer += ioColStride,
819 input1Pointer += input1ColStride,
820 input2Pointer += input2ColStride) {
821 _ioElementOperationType::Operate(*ioPointer,
822 _matrixElementOperationType::Operate(*input1Pointer, *input2Pointer));
830 template<
class _incrementalOperationType,
class _elementOperationType>
833 typedef typename _incrementalOperationType::OutputType
OutputType;
835 template<
class _inputMatrixType,
class _inputScalarType>
837 const _inputScalarType & inputScalar)
839 typedef _inputMatrixType InputMatrixType;
840 typedef typename InputMatrixType::OwnerType InputOwnerType;
843 typedef typename InputOwnerType::const_pointer InputPointerType;
846 const InputOwnerType & inputOwner = inputMatrix.Owner();
848 const size_type rows = inputOwner.rows();
849 const size_type cols = inputOwner.cols();
852 if (inputOwner.IsCompact()) {
856 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
858 const stride_type inputColStride = inputOwner.col_stride();
859 const stride_type inputRowStride = inputOwner.row_stride();
860 const stride_type inputStrideToNextRow = inputRowStride - cols * inputColStride;
861 InputPointerType inputPointer = inputOwner.Pointer();
862 const InputPointerType inputRowEnd = inputPointer + rows * inputRowStride;
863 InputPointerType inputColEnd = inputPointer + cols * inputColStride;
866 inputPointer != inputRowEnd;
867 inputPointer += inputStrideToNextRow, inputColEnd += inputRowStride) {
869 inputPointer != inputColEnd;
870 inputPointer += inputColStride) {
872 _incrementalOperationType::Operate(incrementalResult,
873 _elementOperationType::Operate(*inputPointer, inputScalar));
876 return incrementalResult;
883 template<
class _operationType>
886 template<
class _outputMatrixType,
class _input1MatrixType,
class _input2MatrixType>
887 static void Run(_outputMatrixType & outputMatrix,
888 const _input1MatrixType & input1Matrix,
889 const _input2MatrixType & input2Matrix)
891 typedef _outputMatrixType OutputMatrixType;
894 typedef typename OutputMatrixType::pointer OutputPointerType;
896 typedef _input1MatrixType Input1MatrixType;
897 typedef typename Input1MatrixType::const_pointer Input1PointerType;
899 typedef _input2MatrixType Input2MatrixType;
900 typedef typename Input2MatrixType::const_pointer Input2PointerType;
902 const size_type rows = outputMatrix.rows();
903 const size_type cols = outputMatrix.cols();
904 const size_type input1Cols = input1Matrix.cols();
906 if ((rows != input1Matrix.rows())
907 || (cols != input2Matrix.cols())
908 || (input1Cols != input2Matrix.rows()))
914 const stride_type outputColStride = outputMatrix.col_stride();
915 const stride_type outputRowStride = outputMatrix.row_stride();
916 const stride_type outputStrideToNextRow = outputRowStride - cols * outputColStride;
918 const stride_type input1ColStride = input1Matrix.col_stride();
919 const stride_type input1RowStride = input1Matrix.row_stride();
921 const stride_type input2ColStride = input2Matrix.col_stride();
922 const stride_type input2RowStride = input2Matrix.row_stride();
924 OutputPointerType outputPointer = outputMatrix.Pointer();
925 const OutputPointerType outputRowEnd = outputPointer + rows * outputRowStride;
926 OutputPointerType outputColEnd = outputPointer + cols * outputColStride;
928 Input1PointerType input1Pointer = input1Matrix.Pointer();
929 Input2PointerType input2Pointer = input2Matrix.Pointer();
931 typename Input1MatrixType::ConstRowRefType input1Row;
932 typename Input2MatrixType::ConstColumnRefType input2Col;
934 if ((outputPointer == input1Pointer) ||
935 (outputPointer == input2Pointer)) {
939 for (; outputPointer != outputRowEnd;
940 outputPointer += outputStrideToNextRow,
941 input1Pointer += input1RowStride,
942 input2Pointer = input2Matrix.Pointer(),
943 outputColEnd += outputRowStride)
945 input1Row.SetRef(input1Cols, input1Pointer, input1ColStride);
946 for (; outputPointer != outputColEnd;
947 outputPointer += outputColStride,
948 input2Pointer += input2ColStride)
950 input2Col.SetRef(input1Cols, input2Pointer, input2RowStride);
951 *outputPointer = _operationType::Operate(input1Row, input2Col);
965 template<
class _inputMatrixType>
966 static void Run(
const _inputMatrixType & inputMatrix,
967 typename _inputMatrixType::value_type & minValue,
typename _inputMatrixType::value_type & maxValue)
969 typedef _inputMatrixType InputMatrixType;
970 typedef typename InputMatrixType::OwnerType InputOwnerType;
973 typedef typename InputOwnerType::const_pointer InputPointerType;
974 typedef typename InputOwnerType::value_type value_type;
977 const InputOwnerType & inputOwner = inputMatrix.Owner();
978 InputPointerType inputPointer = inputOwner.Pointer();
980 if (inputPointer == 0)
983 if (inputOwner.IsCompact()) {
987 const size_type rows = inputOwner.rows();
988 const size_type cols = inputOwner.cols();
990 const stride_type inputColStride = inputOwner.col_stride();
991 const stride_type inputRowStride = inputOwner.row_stride();
992 const stride_type inputStrideToNextRow = inputRowStride - cols * inputColStride;
993 const InputPointerType inputRowEnd = inputPointer + rows * inputRowStride;
994 InputPointerType inputColEnd = inputPointer + cols * inputColStride;
996 value_type minElement, maxElement;
997 maxElement = minElement = *inputPointer;
1000 inputPointer != inputRowEnd;
1001 inputPointer += inputStrideToNextRow, inputColEnd += inputRowStride) {
1003 inputPointer != inputColEnd;
1004 inputPointer += inputColStride) {
1005 const value_type element = *inputPointer;
1006 if (element < minElement) {
1007 minElement = element;
1008 }
else if (maxElement < element) {
1009 maxElement = element;
1013 minValue = minElement;
1014 maxValue = maxElement;
1023 template<
class _outputMatrixType,
class _inputMatrixType,
class _indexVectorType>
1024 static void Run(_outputMatrixType & outputMatrix,
const _inputMatrixType & inputMatrix,
1025 const _indexVectorType & indexVector)
1027 typedef _outputMatrixType OutputMatrixType;
1029 typedef _outputMatrixType OutputMatrixType;
1032 typedef typename OutputMatrixType::pointer OutputPointerType;
1034 typedef _inputMatrixType InputMatrixType;
1035 typedef typename InputMatrixType::const_pointer InputPointerType;
1036 typedef _indexVectorType IndexVectorType;
1037 typedef typename IndexVectorType::const_pointer IndexPointerType;
1039 const size_type rows = outputMatrix.rows();
1040 const size_type cols = outputMatrix.cols();
1041 if ((cols != inputMatrix.cols())
1042 || (rows != indexVector.size()))
1048 const stride_type outputColStride = outputMatrix.col_stride();
1049 const stride_type outputRowStride = outputMatrix.row_stride();
1050 const stride_type outputStrideToNextRow = outputRowStride - cols * outputColStride;
1052 const stride_type inputColStride = inputMatrix.col_stride();
1053 const stride_type indexStride = indexVector.stride();
1055 OutputPointerType outputPointer = outputMatrix.Pointer();
1056 const OutputPointerType outputRowEnd = outputPointer + rows * outputRowStride;
1057 OutputPointerType outputColEnd = outputPointer + cols * outputColStride;
1059 InputPointerType inputPointer;
1060 IndexPointerType indexPointer = indexVector.Pointer();
1062 for (; outputPointer != outputRowEnd;
1063 outputPointer += outputStrideToNextRow,
1064 indexPointer += indexStride,
1065 outputColEnd += outputRowStride)
1067 inputPointer = inputMatrix.Pointer(*indexPointer, 0);
1068 for (; outputPointer != outputColEnd;
1069 outputPointer += outputColStride,
1070 inputPointer += inputColStride)
1072 *outputPointer = *inputPointer;
1083 #endif // _vctDynamicMatrixLoopEngines_h
static OutputType Run(const _inputMatrixType &inputMatrix)
Definition: vctDynamicMatrixLoopEngines.h:521
static OutputType Run(const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:406
static void Run(_inputOutputOwnerType &inputOutputOwner)
Definition: vctDynamicCompactLoopEngines.h:367
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:325
static void Run(_outputMatrixType &outputMatrix, const _inputMatrixType &inputMatrix)
Definition: vctDynamicMatrixLoopEngines.h:171
static OutputType Run(const _input1MatrixType &input1Matrix, const _input2MatrixType &input2Matrix)
Definition: vctDynamicMatrixLoopEngines.h:570
static void Run(_inputOutputMatrixType &inputOutputMatrix)
Definition: vctDynamicMatrixLoopEngines.h:235
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicMatrixLoopEngines.h:833
Definition: vctDynamicMatrixLoopEngines.h:276
Portability across compilers and operating systems tools.
static void Run(_outputOwnerType &outputOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:246
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputScalarType inputScalar)
Definition: vctDynamicCompactLoopEngines.h:289
static void Run(_inputOutputMatrixType &inputOutputMatrix, const _inputScalarType inputScalar)
Definition: vctDynamicMatrixLoopEngines.h:475
Definition: vctDynamicMatrixLoopEngines.h:168
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicMatrixLoopEngines.h:518
static void ThrowSizeMismatchException(void)
Definition: vctDynamicMatrixLoopEngines.h:45
static void Run(_outputMatrixType &outputMatrix, const _inputMatrixType &inputMatrix, const _inputScalarType inputScalar)
Definition: vctDynamicMatrixLoopEngines.h:343
static OutputType Run(const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:450
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:121
size_t size_type
Definition: vctContainerTraits.h:35
static void Run(_inputOutputMatrixType &inputOutputMatrix, const _inputMatrixType &inputMatrix)
Definition: vctDynamicMatrixLoopEngines.h:279
Declaration of vctDynamicCompactLoopEngines.
static void Run(_outputMatrixType &outputMatrix, const _input1MatrixType &input1Matrix, const _input2MatrixType &input2Matrix)
Definition: vctDynamicMatrixLoopEngines.h:887
Definition: vctDynamicMatrixLoopEngines.h:406
Container class for the dynamic matrix engines.
Definition: vctDynamicMatrixLoopEngines.h:39
Definition: vctDynamicMatrixLoopEngines.h:89
static void Run(const _inputMatrixType &inputMatrix, typename _inputMatrixType::value_type &minValue, typename _inputMatrixType::value_type &maxValue)
Definition: vctDynamicMatrixLoopEngines.h:966
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicMatrixLoopEngines.h:567
Definition: vctDynamicMatrixLoopEngines.h:565
static void Run(_ioOwnerType &ioOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:549
static void Run(_ioMatrixType &ioMatrix, const _inputScalarType &inputScalar, const _inputMatrixType &inputMatrix)
Definition: vctDynamicMatrixLoopEngines.h:663
static void Run(_outputMatrixType &outputMatrix, const _input1MatrixType &input1Matrix, const _input2MatrixType &input2Matrix)
Definition: vctDynamicMatrixLoopEngines.h:92
Definition: vctDynamicMatrixLoopEngines.h:516
Definition: vctDynamicMatrixLoopEngines.h:1020
Definition: vctDynamicMatrixLoopEngines.h:472
static void ThrowSharedPointersException(void)
Definition: vctDynamicMatrixLoopEngines.h:52
#define cmnThrow(a)
Definition: MinimalCmn.h:4
static void Run(_outputOwnerType &outputOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:75
Definition: vctDynamicMatrixLoopEngines.h:884
Implement operation of the form for fixed size matrices.
Definition: vctDynamicMatrixLoopEngines.h:658
Definition: vctDynamicMatrixLoopEngines.h:340
ptrdiff_t stride_type
Definition: vctContainerTraits.h:37
static void Run(_ioMatrixType &ioMatrix, const _input1MatrixType &input1Matrix, const _input2MatrixType &input2Matrix)
Definition: vctDynamicMatrixLoopEngines.h:754
Implement operation of the form for fixed size matrices.
Definition: vctDynamicMatrixLoopEngines.h:749
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner, const _inputScalarType inputScalar)
Definition: vctDynamicCompactLoopEngines.h:204
static OutputType Run(const _inputMatrixType &inputMatrix, const _inputScalarType &inputScalar)
Definition: vctDynamicMatrixLoopEngines.h:836
Definition: vctDynamicMatrixLoopEngines.h:232
Declaration of the template function cmnThrow.
static OutputType Run(const _inputOwnerType &inputOwner, const _inputScalarType &inputScalar)
Definition: vctDynamicCompactLoopEngines.h:603
static void Run(_outputMatrixType &outputMatrix, const _inputScalarType inputScalar, const _inputMatrixType &inputMatrix)
Definition: vctDynamicMatrixLoopEngines.h:409
static void Run(const _inputOwnerType &inputOwner, typename _inputOwnerType::value_type &minValue, typename _inputOwnerType::value_type &maxValue)
Definition: vctDynamicCompactLoopEngines.h:630
Definition: vctDynamicMatrixLoopEngines.h:962
static void Run(_outputMatrixType &outputMatrix, const _inputMatrixType &inputMatrix, const _indexVectorType &indexVector)
Definition: vctDynamicMatrixLoopEngines.h:1024
static void Run(_ioOwnerType &ioOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:500
Definition: vctDynamicMatrixLoopEngines.h:831