Lösungsvorschlag

#ifndef HPC_ULMLAPACK_GETF2_H
#define HPC_ULMLAPACK_GETF2_H 1

#include <algorithm>
#include <hpc/ulmblas/ger.h>
#include <hpc/ulmblas/iamax.h>
#include <hpc/ulmblas/scal.h>
#include <hpc/ulmblas/swap.h>

namespace hpc { namespace ulmlapack {

template <typename Index, typename TA, typename TP>
Index
getf2(Index m, Index n, TA *A, Index incRowA, Index incColA, TP *p, Index incP)
{
    Index mn = std::min(m,n);

    for (Index j=0; j<mn; ++j) {
        Index i = j+ulmblas::iamax(m-j, &A[j*(incRowA+incColA)], incRowA);
        if (i!=j) {
            ulmblas::swap(n, &A[i*incRowA], incColA, &A[j*incRowA], incColA);
        }
        p[j*incP] = i;
        if (A[j*(incRowA+incColA)]==TA(0)) {
            return j;
        }
        ulmblas::scal(m-1-j, TA(1)/A[j*(incRowA+incColA)],
                      &A[j*(incRowA+incColA)+incRowA], incRowA);
        ulmblas::ger(m-1-j, n-1-j, TA(-1),
                     &A[j*(incRowA+incColA)+incRowA], incRowA,
                     &A[j*(incRowA+incColA)+incColA], incColA,
                     &A[(j+1)*(incRowA+incColA)], incRowA, incColA);
    }
    return -1;
}

} } // namespace ulmblas, hpc

#endif // HPC_ULMLAPACK_GETF2_H