20#ifndef _vctDynamicMatrixLoopEngines_h
21#define _vctDynamicMatrixLoopEngines_h
43 template <
typename _n
size_type>
45 const _nsize_type & received)
CISST_THROW(std::runtime_error) {
46 std::stringstream message;
47 message <<
"vctDynamicMatrixLoopEngines: Sizes of matrices don't match, expected: [" << expected
48 <<
"], received: [" << received <<
"]";
49 cmnThrow(std::runtime_error(message.str()));
56 cmnThrow(std::runtime_error(
"vctDynamicMatrixLoopEngines: Output base pointer is same as one of input base pointers."));
91 template<
class _elementOperationType>
94 template<
class _outputMatrixType,
class _input1MatrixType,
class _input2MatrixType>
95 static void Run(_outputMatrixType & outputMatrix,
96 const _input1MatrixType & input1Matrix,
97 const _input2MatrixType & input2Matrix)
99 typedef _outputMatrixType OutputMatrixType;
100 typedef typename OutputMatrixType::OwnerType OutputOwnerType;
101 typedef typename OutputOwnerType::size_type size_type;
102 typedef typename OutputOwnerType::stride_type stride_type;
103 typedef typename OutputOwnerType::pointer OutputPointerType;
105 typedef _input1MatrixType Input1MatrixType;
106 typedef typename Input1MatrixType::OwnerType Input1OwnerType;
107 typedef typename Input1OwnerType::const_pointer Input1PointerType;
109 typedef _input2MatrixType Input2MatrixType;
110 typedef typename Input2MatrixType::OwnerType Input2OwnerType;
111 typedef typename Input2OwnerType::const_pointer Input2PointerType;
114 OutputOwnerType & outputOwner = outputMatrix.Owner();
115 const Input1OwnerType & input1Owner = input1Matrix.Owner();
116 const Input2OwnerType & input2Owner = input2Matrix.Owner();
118 const size_type
rows = outputOwner.rows();
119 const size_type
cols = outputOwner.cols();
122 if ((
rows != input1Owner.rows())
123 || (
cols != input1Owner.cols())) {
125 input1Owner.sizes());
126 }
else if ((
rows != input2Owner.rows())
127 || (
cols != input2Owner.cols())) {
129 input2Owner.sizes());
133 if (outputOwner.IsCompact() && input1Owner.IsCompact() && input2Owner.IsCompact()
134 && (outputOwner.strides() == input1Owner.strides())
135 && (outputOwner.strides() == input2Owner.strides())) {
138 const stride_type outputColStride = outputOwner.col_stride();
139 const stride_type outputRowStride = outputOwner.row_stride();
140 const stride_type outputStrideToNextRow = outputRowStride -
cols * outputColStride;
142 const stride_type input1ColStride = input1Owner.col_stride();
143 const stride_type input1RowStride = input1Owner.row_stride();
144 const stride_type input1StrideToNextRow = input1RowStride -
cols * input1ColStride;
146 const stride_type input2ColStride = input2Owner.col_stride();
147 const stride_type input2RowStride = input2Owner.row_stride();
148 const stride_type input2StrideToNextRow = input2RowStride -
cols * input2ColStride;
150 OutputPointerType outputPointer = outputOwner.Pointer();
151 const OutputPointerType outputRowEnd = outputPointer +
rows * outputRowStride;
152 OutputPointerType outputColEnd = outputPointer +
cols * outputColStride;
154 Input1PointerType input1Pointer = input1Owner.Pointer();
155 Input2PointerType input2Pointer = input2Owner.Pointer();
158 outputPointer != outputRowEnd;
159 outputPointer += outputStrideToNextRow, input1Pointer += input1StrideToNextRow, input2Pointer += input2StrideToNextRow,
160 outputColEnd += outputRowStride) {
162 outputPointer != outputColEnd;
163 outputPointer += outputColStride, input1Pointer += input1ColStride, input2Pointer += input2ColStride) {
164 *outputPointer = _elementOperationType::Operate(*input1Pointer, *input2Pointer);
172 template<
class _elementOperationType>
175 template<
class _outputMatrixType,
class _inputMatrixType>
176 static inline void Run(_outputMatrixType & outputMatrix,
177 const _inputMatrixType & inputMatrix)
179 typedef _outputMatrixType OutputMatrixType;
180 typedef typename OutputMatrixType::OwnerType OutputOwnerType;
181 typedef typename OutputOwnerType::size_type size_type;
182 typedef typename OutputOwnerType::stride_type stride_type;
183 typedef typename OutputOwnerType::pointer OutputPointerType;
185 typedef _inputMatrixType InputMatrixType;
186 typedef typename InputMatrixType::OwnerType InputOwnerType;
187 typedef typename InputOwnerType::const_pointer InputPointerType;
190 const InputOwnerType & inputOwner = inputMatrix.Owner();
191 OutputOwnerType & outputOwner = outputMatrix.Owner();
193 const size_type
rows = outputMatrix.rows();
194 const size_type
cols = outputMatrix.cols();
197 if ((
rows != inputOwner.rows()) || (
cols != inputOwner.cols())) {
202 if (outputOwner.IsCompact() && inputOwner.IsCompact()
203 && (outputOwner.strides() == inputOwner.strides())) {
207 const stride_type outputColStride = outputOwner.col_stride();
208 const stride_type outputRowStride = outputOwner.row_stride();
209 const stride_type outputStrideToNextRow = outputRowStride -
cols * outputColStride;
211 const stride_type inputColStride = inputOwner.col_stride();
212 const stride_type inputRowStride = inputOwner.row_stride();
213 const stride_type inputStrideToNextRow = inputRowStride -
cols * inputColStride;
215 OutputPointerType outputPointer = outputOwner.Pointer();
216 const OutputPointerType outputRowEnd = outputPointer +
rows * outputRowStride;
217 OutputPointerType outputColEnd = outputPointer +
cols * outputColStride;
219 InputPointerType inputPointer = inputOwner.Pointer();
222 outputPointer != outputRowEnd;
223 outputPointer += outputStrideToNextRow, inputPointer += inputStrideToNextRow,
224 outputColEnd += outputRowStride) {
226 outputPointer != outputColEnd;
227 outputPointer += outputColStride, inputPointer += inputColStride) {
228 *outputPointer = _elementOperationType::Operate(*inputPointer);
236 template<
class _elementOperationType>
239 template<
class _inputOutputMatrixType>
240 static inline void Run(_inputOutputMatrixType & inputOutputMatrix)
242 typedef _inputOutputMatrixType InputOutputMatrixType;
243 typedef typename InputOutputMatrixType::OwnerType InputOutputOwnerType;
244 typedef typename InputOutputOwnerType::size_type size_type;
245 typedef typename InputOutputOwnerType::stride_type stride_type;
246 typedef typename InputOutputOwnerType::pointer PointerType;
249 InputOutputOwnerType & inputOutputOwner = inputOutputMatrix.Owner();
252 if (inputOutputOwner.IsCompact()) {
255 const size_type
rows = inputOutputOwner.rows();
256 const size_type
cols = inputOutputOwner.cols();
258 const stride_type colStride = inputOutputOwner.col_stride();
259 const stride_type rowStride = inputOutputOwner.row_stride();
260 const stride_type strideToNextRow = rowStride -
cols * colStride;
262 PointerType inputOutputPointer = inputOutputOwner.Pointer();
263 const PointerType rowEnd = inputOutputPointer +
rows * rowStride;
264 PointerType colEnd = inputOutputPointer +
cols * colStride;
267 inputOutputPointer != rowEnd;
268 inputOutputPointer += strideToNextRow, colEnd += rowStride) {
270 inputOutputPointer != colEnd;
271 inputOutputPointer += colStride) {
272 _elementOperationType::Operate(*inputOutputPointer);
280 template<
class _elementOperationType>
283 template<
class _inputOutputMatrixType,
class _inputMatrixType>
284 static inline void Run(_inputOutputMatrixType & inputOutputMatrix,
285 const _inputMatrixType & inputMatrix)
287 typedef _inputOutputMatrixType InputOutputMatrixType;
288 typedef typename InputOutputMatrixType::OwnerType InputOutputOwnerType;
289 typedef typename InputOutputOwnerType::size_type size_type;
290 typedef typename InputOutputOwnerType::stride_type stride_type;
291 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
293 typedef _inputMatrixType InputMatrixType;
294 typedef typename InputMatrixType::OwnerType InputOwnerType;
295 typedef typename InputOwnerType::const_pointer InputPointerType;
298 InputOutputOwnerType & inputOutputOwner = inputOutputMatrix.Owner();
299 const InputOwnerType & inputOwner = inputMatrix.Owner();
301 const size_type
rows = inputOutputOwner.rows();
302 const size_type
cols = inputOutputOwner.cols();
305 if ((
rows != inputOwner.rows()) || (
cols != inputOwner.cols())) {
310 if (inputOutputOwner.IsCompact() && inputOwner.IsCompact()
311 && (inputOutputOwner.strides() == inputOwner.strides())) {
314 const stride_type inputOutputColStride = inputOutputOwner.col_stride();
315 const stride_type inputOutputRowStride = inputOutputOwner.row_stride();
316 const stride_type inputOutputStrideToNextRow = inputOutputRowStride -
cols * inputOutputColStride;
318 const stride_type inputColStride = inputOwner.col_stride();
319 const stride_type inputRowStride = inputOwner.row_stride();
320 const stride_type inputStrideToNextRow = inputRowStride -
cols * inputColStride;
322 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
323 const InputOutputPointerType inputOutputRowEnd = inputOutputPointer +
rows * inputOutputRowStride;
324 InputOutputPointerType inputOutputColEnd = inputOutputPointer +
cols * inputOutputColStride;
326 InputPointerType inputPointer = inputOwner.Pointer();
329 inputOutputPointer != inputOutputRowEnd;
330 inputOutputPointer += inputOutputStrideToNextRow, inputPointer += inputStrideToNextRow,
331 inputOutputColEnd += inputOutputRowStride) {
333 inputOutputPointer != inputOutputColEnd;
334 inputOutputPointer += inputOutputColStride, inputPointer += inputColStride) {
335 _elementOperationType::Operate(*inputOutputPointer, *inputPointer);
343 template<
class _elementOperationType>
346 template<
class _outputMatrixType,
class _inputMatrixType,
class _inputScalarType>
347 static void Run(_outputMatrixType & outputMatrix,
348 const _inputMatrixType & inputMatrix,
349 const _inputScalarType inputScalar)
351 typedef _outputMatrixType OutputMatrixType;
352 typedef typename OutputMatrixType::OwnerType OutputOwnerType;
353 typedef typename OutputOwnerType::size_type size_type;
354 typedef typename OutputOwnerType::stride_type stride_type;
355 typedef typename OutputOwnerType::pointer OutputPointerType;
357 typedef _inputMatrixType InputMatrixType;
358 typedef typename InputMatrixType::OwnerType InputOwnerType;
359 typedef typename InputOwnerType::const_pointer InputPointerType;
362 OutputOwnerType & outputOwner = outputMatrix.Owner();
363 const InputOwnerType & inputOwner = inputMatrix.Owner();
365 const size_type
rows = outputOwner.rows();
366 const size_type
cols = outputOwner.cols();
369 if ((
rows != inputOwner.rows()) || (
cols != inputOwner.cols())) {
374 if (outputOwner.IsCompact() && inputOwner.IsCompact()
375 && (outputOwner.strides() == inputOwner.strides())) {
379 const stride_type outputColStride = outputOwner.col_stride();
380 const stride_type outputRowStride = outputOwner.row_stride();
381 const stride_type outputStrideToNextRow = outputRowStride -
cols * outputColStride;
383 const stride_type inputColStride = inputOwner.col_stride();
384 const stride_type inputRowStride = inputOwner.row_stride();
385 const stride_type inputStrideToNextRow = inputRowStride -
cols * inputColStride;
387 OutputPointerType outputPointer = outputOwner.Pointer();
388 const OutputPointerType outputRowEnd = outputPointer +
rows * outputRowStride;
389 OutputPointerType outputColEnd = outputPointer +
cols * outputColStride;
391 InputPointerType inputPointer = inputOwner.Pointer();
394 outputPointer != outputRowEnd;
395 outputPointer += outputStrideToNextRow, inputPointer += inputStrideToNextRow,
396 outputColEnd += outputRowStride) {
398 outputPointer != outputColEnd;
399 outputPointer += outputColStride, inputPointer += inputColStride) {
400 *outputPointer = _elementOperationType::Operate(*inputPointer, inputScalar);
408 template<
class _elementOperationType>
411 template<
class _outputMatrixType,
class _inputScalarType,
class _inputMatrixType>
412 static void Run(_outputMatrixType & outputMatrix,
413 const _inputScalarType inputScalar,
414 const _inputMatrixType & inputMatrix)
416 typedef _outputMatrixType OutputMatrixType;
417 typedef typename OutputMatrixType::OwnerType OutputOwnerType;
418 typedef typename OutputOwnerType::size_type size_type;
419 typedef typename OutputOwnerType::stride_type stride_type;
420 typedef typename OutputOwnerType::pointer OutputPointerType;
422 typedef _inputMatrixType InputMatrixType;
423 typedef typename InputMatrixType::OwnerType InputOwnerType;
424 typedef typename InputOwnerType::const_pointer InputPointerType;
427 OutputOwnerType & outputOwner = outputMatrix.Owner();
428 const InputOwnerType & inputOwner = inputMatrix.Owner();
430 const size_type
rows = outputOwner.rows();
431 const size_type
cols = outputOwner.cols();
434 if ((
rows != inputOwner.rows()) || (
cols != inputOwner.cols())) {
439 if (outputOwner.IsCompact() && inputOwner.IsCompact()
440 && (outputOwner.strides() == inputOwner.strides())) {
444 const stride_type outputColStride = outputOwner.col_stride();
445 const stride_type outputRowStride = outputOwner.row_stride();
446 const stride_type outputStrideToNextRow = outputRowStride -
cols * outputColStride;
448 const stride_type inputColStride = inputOwner.col_stride();
449 const stride_type inputRowStride = inputOwner.row_stride();
450 const stride_type inputStrideToNextRow = inputRowStride -
cols * inputColStride;
452 OutputPointerType outputPointer = outputOwner.Pointer();
453 const OutputPointerType outputRowEnd = outputPointer +
rows * outputRowStride;
454 OutputPointerType outputColEnd = outputPointer +
cols * outputColStride;
456 InputPointerType inputPointer = inputOwner.Pointer();
459 outputPointer != outputRowEnd;
460 outputPointer += outputStrideToNextRow, inputPointer += inputStrideToNextRow,
461 outputColEnd += outputRowStride) {
463 outputPointer != outputColEnd;
464 outputPointer += outputColStride, inputPointer += inputColStride) {
465 *outputPointer = _elementOperationType::Operate(inputScalar, *inputPointer);
473 template<
class _elementOperationType>
476 template<
class _inputOutputMatrixType,
class _inputScalarType>
477 static void Run(_inputOutputMatrixType & inputOutputMatrix,
478 const _inputScalarType inputScalar)
480 typedef _inputOutputMatrixType InputOutputMatrixType;
481 typedef typename InputOutputMatrixType::OwnerType InputOutputOwnerType;
482 typedef typename InputOutputOwnerType::size_type size_type;
483 typedef typename InputOutputOwnerType::stride_type stride_type;
484 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
487 InputOutputOwnerType & inputOutputOwner = inputOutputMatrix.Owner();
489 if (inputOutputOwner.IsCompact()) {
492 const size_type
rows = inputOutputOwner.rows();
493 const size_type
cols = inputOutputOwner.cols();
495 const stride_type colStride = inputOutputOwner.col_stride();
496 const stride_type rowStride = inputOutputOwner.row_stride();
497 const stride_type strideToNextRow = rowStride -
cols * colStride;
499 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
500 const InputOutputPointerType rowEnd = inputOutputPointer +
rows * rowStride;
501 InputOutputPointerType colEnd = inputOutputPointer +
cols * colStride;
504 inputOutputPointer != rowEnd;
505 inputOutputPointer += strideToNextRow, colEnd += rowStride) {
507 inputOutputPointer != colEnd;
508 inputOutputPointer += colStride) {
509 _elementOperationType::Operate(*inputOutputPointer, inputScalar);
517 template<
class _incrementalOperationType,
class _elementOperationType>
520 typedef typename _incrementalOperationType::OutputType
OutputType;
522 template<
class _inputMatrixType>
525 typedef _inputMatrixType InputMatrixType;
526 typedef typename InputMatrixType::OwnerType InputOwnerType;
527 typedef typename InputOwnerType::size_type size_type;
528 typedef typename InputOwnerType::stride_type stride_type;
529 typedef typename InputOwnerType::const_pointer InputPointerType;
532 const InputOwnerType & inputOwner = inputMatrix.Owner();
534 if (inputOwner.IsCompact()) {
538 const size_type
rows = inputOwner.rows();
539 const size_type
cols = inputOwner.cols();
541 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
543 const stride_type inputColStride = inputOwner.col_stride();
544 const stride_type inputRowStride = inputOwner.row_stride();
545 const stride_type inputStrideToNextRow = inputRowStride -
cols * inputColStride;
546 InputPointerType inputPointer = inputOwner.Pointer();
547 const InputPointerType inputRowEnd = inputPointer +
rows * inputRowStride;
548 InputPointerType inputColEnd = inputPointer +
cols * inputColStride;
551 inputPointer != inputRowEnd;
552 inputPointer += inputStrideToNextRow, inputColEnd += inputRowStride) {
554 inputPointer != inputColEnd;
555 inputPointer += inputColStride) {
556 incrementalResult = _incrementalOperationType::Operate(
557 incrementalResult, _elementOperationType::Operate(*inputPointer) );
560 return incrementalResult;
566 template<
class _incrementalOperationType,
class _elementOperationType>
569 typedef typename _incrementalOperationType::OutputType
OutputType;
571 template<
class _input1MatrixType,
class _input2MatrixType>
573 const _input2MatrixType & input2Matrix) {
574 typedef _input1MatrixType Input1MatrixType;
575 typedef typename Input1MatrixType::OwnerType Input1OwnerType;
576 typedef typename Input1OwnerType::size_type size_type;
577 typedef typename Input1OwnerType::stride_type stride_type;
578 typedef typename Input1OwnerType::const_pointer Input1PointerType;
580 typedef _input2MatrixType Input2MatrixType;
581 typedef typename Input2MatrixType::OwnerType Input2OwnerType;
582 typedef typename Input2OwnerType::const_pointer Input2PointerType;
585 const Input1OwnerType & input1Owner = input1Matrix.Owner();
586 const Input2OwnerType & input2Owner = input2Matrix.Owner();
588 const size_type
rows = input1Owner.rows();
589 const size_type
cols = input1Owner.cols();
592 if ((
rows != input2Owner.rows()) || (
cols != input2Owner.cols())) {
597 if (input1Owner.IsCompact() && input2Owner.IsCompact()
598 && (input1Owner.strides() == input2Owner.strides())) {
602 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
603 const stride_type input1ColStride = input1Owner.col_stride();
604 const stride_type input1RowStride = input1Owner.row_stride();
605 const stride_type input1StrideToNextRow = input1RowStride -
cols * input1ColStride;
607 const stride_type input2ColStride = input2Owner.col_stride();
608 const stride_type input2RowStride = input2Owner.row_stride();
609 const stride_type input2StrideToNextRow = input2RowStride -
cols * input2ColStride;
611 Input1PointerType input1Pointer = input1Owner.Pointer();
612 const Input1PointerType input1RowEnd = input1Pointer +
rows * input1RowStride;
613 Input1PointerType input1ColEnd = input1Pointer +
cols * input1ColStride;
615 Input2PointerType input2Pointer = input2Owner.Pointer();
618 input1Pointer != input1RowEnd;
619 input1Pointer += input1StrideToNextRow, input2Pointer += input2StrideToNextRow,
620 input1ColEnd += input1RowStride) {
622 input1Pointer != input1ColEnd;
623 input1Pointer += input1ColStride, input2Pointer += input2ColStride) {
624 incrementalResult = _incrementalOperationType::Operate(incrementalResult,
625 _elementOperationType::Operate(*input1Pointer, *input2Pointer) );
628 return incrementalResult;
659 template<
class _ioElementOperationType,
class _scalarMatrixElementOperationType>
664 template<
class _ioMatrixType,
class _inputScalarType,
class _inputMatrixType>
665 static inline void Run(_ioMatrixType & ioMatrix,
666 const _inputScalarType & inputScalar,
667 const _inputMatrixType & inputMatrix)
669 typedef _ioMatrixType IoMatrixType;
670 typedef typename IoMatrixType::OwnerType IoOwnerType;
671 typedef typename IoOwnerType::size_type size_type;
672 typedef typename IoOwnerType::stride_type stride_type;
673 typedef typename IoOwnerType::pointer IoPointerType;
675 typedef _inputMatrixType InputMatrixType;
676 typedef typename InputMatrixType::OwnerType InputOwnerType;
677 typedef typename InputOwnerType::const_pointer InputPointerType;
680 IoOwnerType & ioOwner = ioMatrix.Owner();
681 const InputOwnerType & inputOwner = inputMatrix.Owner();
683 const size_type
rows = ioOwner.rows();
684 const size_type
cols = ioOwner.cols();
687 if ((
rows != inputOwner.rows()) || (
cols != inputOwner.cols())) {
692 if (ioOwner.IsCompact() && inputOwner.IsCompact()
693 && (ioOwner.strides() == inputOwner.strides())) {
697 const stride_type ioColStride = ioOwner.col_stride();
698 const stride_type ioRowStride = ioOwner.row_stride();
699 const stride_type ioStrideToNextRow = ioRowStride -
cols * ioColStride;
701 const stride_type inputColStride = inputOwner.col_stride();
702 const stride_type inputRowStride = inputOwner.row_stride();
703 const stride_type inputStrideToNextRow = inputRowStride -
cols * inputColStride;
705 IoPointerType ioPointer = ioOwner.Pointer();
706 InputPointerType inputPointer = inputOwner.Pointer();
708 size_type rowIndex, colIndex;
711 ++rowIndex, ioPointer += ioStrideToNextRow, inputPointer += inputStrideToNextRow) {
714 ++colIndex, ioPointer += ioColStride, inputPointer += inputColStride) {
715 _ioElementOperationType::Operate(*ioPointer,
716 _scalarMatrixElementOperationType::Operate(inputScalar, *inputPointer));
750 template<
class _ioElementOperationType,
class _matrixElementOperationType>
755 template<
class _ioMatrixType,
class _input1MatrixType,
class _input2MatrixType>
756 static inline void Run(_ioMatrixType & ioMatrix,
757 const _input1MatrixType & input1Matrix,
758 const _input2MatrixType & input2Matrix)
760 typedef _ioMatrixType IoMatrixType;
761 typedef typename IoMatrixType::OwnerType IoOwnerType;
762 typedef typename IoOwnerType::size_type size_type;
763 typedef typename IoOwnerType::stride_type stride_type;
764 typedef typename IoOwnerType::pointer IoPointerType;
766 typedef _input1MatrixType Input1MatrixType;
767 typedef typename Input1MatrixType::OwnerType Input1OwnerType;
768 typedef typename Input1OwnerType::const_pointer Input1PointerType;
770 typedef _input2MatrixType Input2MatrixType;
771 typedef typename Input2MatrixType::OwnerType Input2OwnerType;
772 typedef typename Input2OwnerType::const_pointer Input2PointerType;
775 IoOwnerType & ioOwner = ioMatrix.Owner();
776 const Input1OwnerType & input1Owner = input1Matrix.Owner();
777 const Input2OwnerType & input2Owner = input2Matrix.Owner();
779 const size_type
rows = ioOwner.rows();
780 const size_type
cols = ioOwner.cols();
783 if ((
rows != input1Owner.rows())
784 || (
cols != input1Owner.cols())) {
786 input1Owner.sizes());
787 }
else if ((
rows != input2Owner.rows())
788 || (
cols != input2Owner.cols())) {
790 input2Owner.sizes());
794 if (ioOwner.IsCompact() && input1Owner.IsCompact() && input2Owner.IsCompact()
795 && (ioOwner.strides() == input1Owner.strides())
796 && (ioOwner.strides() == input2Owner.strides())) {
800 const stride_type ioColStride = ioOwner.col_stride();
801 const stride_type ioRowStride = ioOwner.row_stride();
802 const stride_type ioStrideToNextRow = ioRowStride -
cols * ioColStride;
804 const stride_type input1ColStride = input1Owner.col_stride();
805 const stride_type input1RowStride = input1Owner.row_stride();
806 const stride_type input1StrideToNextRow = input1RowStride -
cols * input1ColStride;
808 const stride_type input2ColStride = input2Owner.col_stride();
809 const stride_type input2RowStride = input2Owner.row_stride();
810 const stride_type input2StrideToNextRow = input2RowStride -
cols * input2ColStride;
812 IoPointerType ioPointer = ioOwner.Pointer();
813 Input1PointerType input1Pointer = input1Owner.Pointer();
814 Input2PointerType input2Pointer = input2Owner.Pointer();
816 size_type rowIndex, colIndex;
819 ++rowIndex, ioPointer += ioStrideToNextRow,
820 input1Pointer += input1StrideToNextRow,
821 input2Pointer += input2StrideToNextRow) {
824 ++colIndex, ioPointer += ioColStride,
825 input1Pointer += input1ColStride,
826 input2Pointer += input2ColStride) {
827 _ioElementOperationType::Operate(*ioPointer,
828 _matrixElementOperationType::Operate(*input1Pointer, *input2Pointer));
836 template<
class _incrementalOperationType,
class _elementOperationType>
839 typedef typename _incrementalOperationType::OutputType
OutputType;
841 template<
class _inputMatrixType,
class _inputScalarType>
843 const _inputScalarType & inputScalar)
845 typedef _inputMatrixType InputMatrixType;
846 typedef typename InputMatrixType::OwnerType InputOwnerType;
847 typedef typename InputOwnerType::size_type size_type;
848 typedef typename InputOwnerType::stride_type stride_type;
849 typedef typename InputOwnerType::const_pointer InputPointerType;
852 const InputOwnerType & inputOwner = inputMatrix.Owner();
854 const size_type
rows = inputOwner.rows();
855 const size_type
cols = inputOwner.cols();
858 if (inputOwner.IsCompact()) {
862 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
864 const stride_type inputColStride = inputOwner.col_stride();
865 const stride_type inputRowStride = inputOwner.row_stride();
866 const stride_type inputStrideToNextRow = inputRowStride -
cols * inputColStride;
867 InputPointerType inputPointer = inputOwner.Pointer();
868 const InputPointerType inputRowEnd = inputPointer +
rows * inputRowStride;
869 InputPointerType inputColEnd = inputPointer +
cols * inputColStride;
872 inputPointer != inputRowEnd;
873 inputPointer += inputStrideToNextRow, inputColEnd += inputRowStride) {
875 inputPointer != inputColEnd;
876 inputPointer += inputColStride) {
878 _incrementalOperationType::Operate(incrementalResult,
879 _elementOperationType::Operate(*inputPointer, inputScalar));
882 return incrementalResult;
889 template<
class _operationType>
892 template<
class _outputMatrixType,
class _input1MatrixType,
class _input2MatrixType>
893 static void Run(_outputMatrixType & outputMatrix,
894 const _input1MatrixType & input1Matrix,
895 const _input2MatrixType & input2Matrix)
897 typedef _outputMatrixType OutputMatrixType;
898 typedef typename OutputMatrixType::size_type size_type;
899 typedef typename OutputMatrixType::stride_type stride_type;
900 typedef typename OutputMatrixType::pointer OutputPointerType;
902 typedef _input1MatrixType Input1MatrixType;
903 typedef typename Input1MatrixType::const_pointer Input1PointerType;
905 typedef _input2MatrixType Input2MatrixType;
906 typedef typename Input2MatrixType::const_pointer Input2PointerType;
908 const size_type
rows = outputMatrix.rows();
909 const size_type
cols = outputMatrix.cols();
910 const size_type input1Cols = input1Matrix.cols();
912 if (
rows != input1Matrix.rows()) {
913 std::stringstream message;
914 message <<
"vctDynamicMatrixLoopEngines::Product: Sizes of matrices don't match, expected rows: " <<
rows
915 <<
", received: " << input1Matrix.rows();
916 cmnThrow(std::runtime_error(message.str()));
917 }
else if ((
cols != input2Matrix.cols())
918 || (input1Cols != input2Matrix.rows())) {
919 std::stringstream message;
920 message <<
"vctDynamicMatrixLoopEngines: Sizes of matrices don't match, expected: ["
921 << input1Cols <<
" " <<
cols <<
"], received: " << input2Matrix.sizes();
922 cmnThrow(std::runtime_error(message.str()));
926 const stride_type outputColStride = outputMatrix.col_stride();
927 const stride_type outputRowStride = outputMatrix.row_stride();
928 const stride_type outputStrideToNextRow = outputRowStride -
cols * outputColStride;
930 const stride_type input1ColStride = input1Matrix.col_stride();
931 const stride_type input1RowStride = input1Matrix.row_stride();
933 const stride_type input2ColStride = input2Matrix.col_stride();
934 const stride_type input2RowStride = input2Matrix.row_stride();
936 OutputPointerType outputPointer = outputMatrix.Pointer();
937 const OutputPointerType outputRowEnd = outputPointer +
rows * outputRowStride;
938 OutputPointerType outputColEnd = outputPointer +
cols * outputColStride;
940 Input1PointerType input1Pointer = input1Matrix.Pointer();
941 Input2PointerType input2Pointer = input2Matrix.Pointer();
943 typename Input1MatrixType::ConstRowRefType input1Row;
944 typename Input2MatrixType::ConstColumnRefType input2Col;
946 if ((outputPointer == input1Pointer) ||
947 (outputPointer == input2Pointer)) {
951 for (; outputPointer != outputRowEnd;
952 outputPointer += outputStrideToNextRow,
953 input1Pointer += input1RowStride,
954 input2Pointer = input2Matrix.Pointer(),
955 outputColEnd += outputRowStride)
957 input1Row.SetRef(input1Cols, input1Pointer, input1ColStride);
958 for (; outputPointer != outputColEnd;
959 outputPointer += outputColStride,
960 input2Pointer += input2ColStride)
962 input2Col.SetRef(input1Cols, input2Pointer, input2RowStride);
963 *outputPointer = _operationType::Operate(input1Row, input2Col);
977 template<
class _inputMatrixType>
978 static void Run(
const _inputMatrixType & inputMatrix,
979 typename _inputMatrixType::value_type & minValue,
typename _inputMatrixType::value_type & maxValue)
981 typedef _inputMatrixType InputMatrixType;
982 typedef typename InputMatrixType::OwnerType InputOwnerType;
983 typedef typename InputOwnerType::size_type size_type;
984 typedef typename InputOwnerType::stride_type stride_type;
985 typedef typename InputOwnerType::const_pointer InputPointerType;
986 typedef typename InputOwnerType::value_type
value_type;
989 const InputOwnerType & inputOwner = inputMatrix.Owner();
990 InputPointerType inputPointer = inputOwner.Pointer();
992 if (inputPointer == 0)
995 if (inputOwner.IsCompact()) {
999 const size_type
rows = inputOwner.rows();
1000 const size_type
cols = inputOwner.cols();
1002 const stride_type inputColStride = inputOwner.col_stride();
1003 const stride_type inputRowStride = inputOwner.row_stride();
1004 const stride_type inputStrideToNextRow = inputRowStride -
cols * inputColStride;
1005 const InputPointerType inputRowEnd = inputPointer +
rows * inputRowStride;
1006 InputPointerType inputColEnd = inputPointer +
cols * inputColStride;
1009 maxElement = minElement = *inputPointer;
1012 inputPointer != inputRowEnd;
1013 inputPointer += inputStrideToNextRow, inputColEnd += inputRowStride) {
1015 inputPointer != inputColEnd;
1016 inputPointer += inputColStride) {
1018 if (element < minElement) {
1019 minElement = element;
1020 }
else if (maxElement < element) {
1021 maxElement = element;
1025 minValue = minElement;
1026 maxValue = maxElement;
1035 template<
class _outputMatrixType,
class _inputMatrixType,
class _indexVectorType>
1036 static void Run(_outputMatrixType & outputMatrix,
const _inputMatrixType & inputMatrix,
1037 const _indexVectorType & indexVector)
1039 typedef _outputMatrixType OutputMatrixType;
1041 typedef _outputMatrixType OutputMatrixType;
1042 typedef typename OutputMatrixType::size_type size_type;
1043 typedef typename OutputMatrixType::stride_type stride_type;
1044 typedef typename OutputMatrixType::pointer OutputPointerType;
1046 typedef _inputMatrixType InputMatrixType;
1047 typedef typename InputMatrixType::const_pointer InputPointerType;
1048 typedef _indexVectorType IndexVectorType;
1049 typedef typename IndexVectorType::const_pointer IndexPointerType;
1051 const size_type
rows = outputMatrix.rows();
1052 const size_type
cols = outputMatrix.cols();
1053 if (
cols != inputMatrix.cols()) {
1054 std::stringstream message;
1055 message <<
"vctDynamicMatrixLoopEngines::SelectRowsByIndex: Sizes of matrices don't match, expected cols: "
1056 <<
cols <<
", received: " << inputMatrix.cols();
1057 cmnThrow(std::runtime_error(message.str()));
1058 }
else if (
rows != indexVector.size()) {
1059 std::stringstream message;
1060 message <<
"vctDynamicMatrixLoopEngines::SelectRowsByIndex: Sizes of matrices don't match, expected rows: "
1061 <<
rows <<
", received: " << indexVector.size();
1062 cmnThrow(std::runtime_error(message.str()));
1066 const stride_type outputColStride = outputMatrix.col_stride();
1067 const stride_type outputRowStride = outputMatrix.row_stride();
1068 const stride_type outputStrideToNextRow = outputRowStride -
cols * outputColStride;
1070 const stride_type inputColStride = inputMatrix.col_stride();
1071 const stride_type indexStride = indexVector.stride();
1073 OutputPointerType outputPointer = outputMatrix.Pointer();
1074 const OutputPointerType outputRowEnd = outputPointer +
rows * outputRowStride;
1075 OutputPointerType outputColEnd = outputPointer +
cols * outputColStride;
1077 InputPointerType inputPointer;
1078 IndexPointerType indexPointer = indexVector.Pointer();
1080 for (; outputPointer != outputRowEnd;
1081 outputPointer += outputStrideToNextRow,
1082 indexPointer += indexStride,
1083 outputColEnd += outputRowStride)
1085 inputPointer = inputMatrix.Pointer(*indexPointer, 0);
1086 for (; outputPointer != outputColEnd;
1087 outputPointer += outputColStride,
1088 inputPointer += inputColStride)
1090 *outputPointer = *inputPointer;
static void Run(_ioOwnerType &ioOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition vctDynamicCompactLoopEngines.h:549
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:121
static void Run(_inputOutputOwnerType &inputOutputOwner)
Definition vctDynamicCompactLoopEngines.h:367
static void Run(_ioOwnerType &ioOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:500
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputScalarType inputScalar)
Definition vctDynamicCompactLoopEngines.h:289
static void Run(_outputOwnerType &outputOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition vctDynamicCompactLoopEngines.h:75
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:325
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner, const _inputScalarType inputScalar)
Definition vctDynamicCompactLoopEngines.h:204
static void Run(_outputOwnerType &outputOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:246
static void Run(const _inputOwnerType &inputOwner, typename _inputOwnerType::value_type &minValue, typename _inputOwnerType::value_type &maxValue)
Definition vctDynamicCompactLoopEngines.h:630
static OutputType Run(const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition vctDynamicCompactLoopEngines.h:450
Implement operation of the form for compact containers.
Definition vctDynamicCompactLoopEngines.h:401
static OutputType Run(const _inputOwnerType &inputOwner, const _inputScalarType &inputScalar)
Definition vctDynamicCompactLoopEngines.h:603
Definition vctDynamicMatrixLoopEngines.h:975
static void Run(const _inputMatrixType &inputMatrix, typename _inputMatrixType::value_type &minValue, typename _inputMatrixType::value_type &maxValue)
Definition vctDynamicMatrixLoopEngines.h:978
Definition vctDynamicMatrixLoopEngines.h:237
static void Run(_inputOutputMatrixType &inputOutputMatrix)
Definition vctDynamicMatrixLoopEngines.h:240
Definition vctDynamicMatrixLoopEngines.h:281
static void Run(_inputOutputMatrixType &inputOutputMatrix, const _inputMatrixType &inputMatrix)
Definition vctDynamicMatrixLoopEngines.h:284
Implement operation of the form for fixed size matrices.
Definition vctDynamicMatrixLoopEngines.h:752
static void Run(_ioMatrixType &ioMatrix, const _input1MatrixType &input1Matrix, const _input2MatrixType &input2Matrix)
Definition vctDynamicMatrixLoopEngines.h:756
Definition vctDynamicMatrixLoopEngines.h:474
static void Run(_inputOutputMatrixType &inputOutputMatrix, const _inputScalarType inputScalar)
Definition vctDynamicMatrixLoopEngines.h:477
Implement operation of the form for fixed size matrices.
Definition vctDynamicMatrixLoopEngines.h:661
static void Run(_ioMatrixType &ioMatrix, const _inputScalarType &inputScalar, const _inputMatrixType &inputMatrix)
Definition vctDynamicMatrixLoopEngines.h:665
Definition vctDynamicMatrixLoopEngines.h:173
static void Run(_outputMatrixType &outputMatrix, const _inputMatrixType &inputMatrix)
Definition vctDynamicMatrixLoopEngines.h:176
Definition vctDynamicMatrixLoopEngines.h:92
static void Run(_outputMatrixType &outputMatrix, const _input1MatrixType &input1Matrix, const _input2MatrixType &input2Matrix)
Definition vctDynamicMatrixLoopEngines.h:95
Definition vctDynamicMatrixLoopEngines.h:344
static void Run(_outputMatrixType &outputMatrix, const _inputMatrixType &inputMatrix, const _inputScalarType inputScalar)
Definition vctDynamicMatrixLoopEngines.h:347
Definition vctDynamicMatrixLoopEngines.h:409
static void Run(_outputMatrixType &outputMatrix, const _inputScalarType inputScalar, const _inputMatrixType &inputMatrix)
Definition vctDynamicMatrixLoopEngines.h:412
Definition vctDynamicMatrixLoopEngines.h:890
static void Run(_outputMatrixType &outputMatrix, const _input1MatrixType &input1Matrix, const _input2MatrixType &input2Matrix)
Definition vctDynamicMatrixLoopEngines.h:893
Definition vctDynamicMatrixLoopEngines.h:1033
static void Run(_outputMatrixType &outputMatrix, const _inputMatrixType &inputMatrix, const _indexVectorType &indexVector)
Definition vctDynamicMatrixLoopEngines.h:1036
Definition vctDynamicMatrixLoopEngines.h:518
_incrementalOperationType::OutputType OutputType
Definition vctDynamicMatrixLoopEngines.h:520
static OutputType Run(const _inputMatrixType &inputMatrix)
Definition vctDynamicMatrixLoopEngines.h:523
Definition vctDynamicMatrixLoopEngines.h:567
static OutputType Run(const _input1MatrixType &input1Matrix, const _input2MatrixType &input2Matrix)
Definition vctDynamicMatrixLoopEngines.h:572
_incrementalOperationType::OutputType OutputType
Definition vctDynamicMatrixLoopEngines.h:569
Definition vctDynamicMatrixLoopEngines.h:837
_incrementalOperationType::OutputType OutputType
Definition vctDynamicMatrixLoopEngines.h:839
static OutputType Run(const _inputMatrixType &inputMatrix, const _inputScalarType &inputScalar)
Definition vctDynamicMatrixLoopEngines.h:842
Container class for the dynamic matrix engines.
Definition vctDynamicMatrixLoopEngines.h:37
static void ThrowSizeMismatchException(const _nsize_type &expected, const _nsize_type &received) CISST_THROW(std
Definition vctDynamicMatrixLoopEngines.h:44
static void ThrowSharedPointersException(void) CISST_THROW(std
Definition vctDynamicMatrixLoopEngines.h:55
Portability across compilers and operating systems tools.
#define CISST_THROW(exceptionParameter)
Somewhat portable compilation warning message. This works with very recent versions of gcc (4....
Definition cmnPortability.h:559
Declaration of the template function cmnThrow.
void cmnThrow(const _exceptionType &except, cmnLogLevel lod=CMN_LOG_LEVEL_INIT_ERROR)
Definition cmnThrow.h:76
Declaration of vctDynamicCompactLoopEngines.
size_type cols() const
Definition vctDynamicConstMatrixBase.h:243
size_type rows() const
Definition vctDynamicConstMatrixBase.h:238