mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
add RealView api
This commit is contained in:
committed by
Rasmus Munk Larsen
parent
954e21152e
commit
43a65a9cbd
110
test/realview.cpp
Normal file
110
test/realview.cpp
Normal file
@@ -0,0 +1,110 @@
|
||||
// This file is part of Eigen, a lightweight C++ template library
|
||||
// for linear algebra.
|
||||
//
|
||||
// Copyright (C) 2025 The Eigen Authors
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla
|
||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#include "main.h"
|
||||
|
||||
template <typename T>
|
||||
void test_realview(const T&) {
|
||||
using Scalar = typename T::Scalar;
|
||||
using RealScalar = typename NumTraits<Scalar>::Real;
|
||||
|
||||
constexpr Index minRows = T::RowsAtCompileTime == Dynamic ? 1 : T::RowsAtCompileTime;
|
||||
constexpr Index maxRows = T::MaxRowsAtCompileTime == Dynamic ? (EIGEN_TEST_MAX_SIZE / 2) : T::MaxRowsAtCompileTime;
|
||||
constexpr Index minCols = T::ColsAtCompileTime == Dynamic ? 1 : T::ColsAtCompileTime;
|
||||
constexpr Index maxCols = T::MaxColsAtCompileTime == Dynamic ? (EIGEN_TEST_MAX_SIZE / 2) : T::MaxColsAtCompileTime;
|
||||
|
||||
constexpr Index rowFactor = (NumTraits<Scalar>::IsComplex && !T::IsRowMajor) ? 2 : 1;
|
||||
constexpr Index colFactor = (NumTraits<Scalar>::IsComplex && T::IsRowMajor) ? 2 : 1;
|
||||
constexpr Index sizeFactor = NumTraits<Scalar>::IsComplex ? 2 : 1;
|
||||
|
||||
Index rows = internal::random<Index>(minRows, maxRows);
|
||||
Index cols = internal::random<Index>(minCols, maxCols);
|
||||
|
||||
T A(rows, cols), B, C;
|
||||
|
||||
VERIFY(A.realView().rows() == rowFactor * A.rows());
|
||||
VERIFY(A.realView().cols() == colFactor * A.cols());
|
||||
VERIFY(A.realView().size() == sizeFactor * A.size());
|
||||
|
||||
RealScalar alpha = internal::random(RealScalar(1), RealScalar(2));
|
||||
A.setRandom();
|
||||
|
||||
VERIFY_IS_APPROX(A.matrix().squaredNorm(), A.realView().matrix().squaredNorm());
|
||||
|
||||
// test re-sizing realView during assignment
|
||||
B.realView() = A.realView();
|
||||
VERIFY_IS_APPROX(A, B);
|
||||
VERIFY_IS_APPROX(A.realView(), B.realView());
|
||||
|
||||
// B = A * alpha
|
||||
for (Index r = 0; r < rows; r++) {
|
||||
for (Index c = 0; c < cols; c++) {
|
||||
B.coeffRef(r, c) = A.coeff(r, c) * Scalar(alpha);
|
||||
}
|
||||
}
|
||||
|
||||
VERIFY_IS_APPROX(B.realView(), A.realView() * alpha);
|
||||
C = A;
|
||||
C.realView() *= alpha;
|
||||
VERIFY_IS_APPROX(B, C);
|
||||
|
||||
alpha = internal::random(RealScalar(1), RealScalar(2));
|
||||
A.setRandom();
|
||||
|
||||
// B = A / alpha
|
||||
for (Index r = 0; r < rows; r++) {
|
||||
for (Index c = 0; c < cols; c++) {
|
||||
B.coeffRef(r, c) = A.coeff(r, c) / Scalar(alpha);
|
||||
}
|
||||
}
|
||||
|
||||
VERIFY_IS_APPROX(B.realView(), A.realView() / alpha);
|
||||
C = A;
|
||||
C.realView() /= alpha;
|
||||
VERIFY_IS_APPROX(B, C);
|
||||
}
|
||||
|
||||
template <typename Scalar, int Rows, int Cols, int MaxRows = Rows, int MaxCols = Cols>
|
||||
void test_realview_driver() {
|
||||
// if Rows == 1, don't test ColMajor as it is not a valid array
|
||||
using ColMajorMatrixType = Matrix<Scalar, Rows, Cols, Rows == 1 ? RowMajor : ColMajor, MaxRows, MaxCols>;
|
||||
using ColMajorArrayType = Array<Scalar, Rows, Cols, Rows == 1 ? RowMajor : ColMajor, MaxRows, MaxCols>;
|
||||
// if Cols == 1, don't test RowMajor as it is not a valid array
|
||||
using RowMajorMatrixType = Matrix<Scalar, Rows, Cols, Cols == 1 ? ColMajor : RowMajor, MaxRows, MaxCols>;
|
||||
using RowMajorArrayType = Array<Scalar, Rows, Cols, Cols == 1 ? ColMajor : RowMajor, MaxRows, MaxCols>;
|
||||
test_realview(ColMajorMatrixType());
|
||||
test_realview(ColMajorArrayType());
|
||||
test_realview(RowMajorMatrixType());
|
||||
test_realview(RowMajorArrayType());
|
||||
}
|
||||
|
||||
template <int Rows, int Cols, int MaxRows = Rows, int MaxCols = Cols>
|
||||
void test_realview_driver_complex() {
|
||||
test_realview_driver<float, Rows, Cols, MaxRows, MaxCols>();
|
||||
test_realview_driver<std::complex<float>, Rows, Cols, MaxRows, MaxCols>();
|
||||
test_realview_driver<double, Rows, Cols, MaxRows, MaxCols>();
|
||||
test_realview_driver<std::complex<double>, Rows, Cols, MaxRows, MaxCols>();
|
||||
test_realview_driver<long double, Rows, Cols, MaxRows, MaxCols>();
|
||||
test_realview_driver<std::complex<long double>, Rows, Cols, MaxRows, MaxCols>();
|
||||
}
|
||||
|
||||
EIGEN_DECLARE_TEST(realview) {
|
||||
for (int i = 0; i < g_repeat; i++) {
|
||||
CALL_SUBTEST_1((test_realview_driver_complex<Dynamic, Dynamic, Dynamic, Dynamic>()));
|
||||
CALL_SUBTEST_2((test_realview_driver_complex<Dynamic, Dynamic, 17, Dynamic>()));
|
||||
CALL_SUBTEST_3((test_realview_driver_complex<Dynamic, Dynamic, Dynamic, 19>()));
|
||||
CALL_SUBTEST_4((test_realview_driver_complex<Dynamic, Dynamic, 17, 19>()));
|
||||
CALL_SUBTEST_5((test_realview_driver_complex<17, Dynamic, 17, Dynamic>()));
|
||||
CALL_SUBTEST_6((test_realview_driver_complex<Dynamic, 19, Dynamic, 19>()));
|
||||
CALL_SUBTEST_7((test_realview_driver_complex<17, 19, 17, 19>()));
|
||||
CALL_SUBTEST_8((test_realview_driver_complex<Dynamic, 1>()));
|
||||
CALL_SUBTEST_9((test_realview_driver_complex<1, Dynamic>()));
|
||||
CALL_SUBTEST_10((test_realview_driver_complex<1, 1>()));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user