Files
eigen/test/no_automatic_resizing.cpp
2026-02-26 07:54:27 -08:00

107 lines
3.0 KiB
C++

// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2026 Rasmus Munk Larsen <rmlarsen@gmail.com>
//
// 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/.
// Test that EIGEN_NO_AUTOMATIC_RESIZING still allows assignment to
// default-constructed (empty) matrices and arrays.
#define EIGEN_NO_AUTOMATIC_RESIZING
#include "main.h"
template <typename Scalar>
void testNoAutomaticResizing() {
using Matrix = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
using Vector = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>;
using RowVector = Eigen::Matrix<Scalar, 1, Eigen::Dynamic>;
using Array = Eigen::Array<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
using ArrayVector = Eigen::Array<Scalar, Eigen::Dynamic, 1>;
const Index rows = internal::random<Index>(1, 50);
const Index cols = internal::random<Index>(1, 50);
// Assignment of Zero expression to default-constructed matrix.
{
Matrix M;
M = Matrix::Zero(rows, cols);
VERIFY_IS_EQUAL(M.rows(), rows);
VERIFY_IS_EQUAL(M.cols(), cols);
VERIFY_IS_EQUAL(M.norm(), Scalar(0));
}
// Assignment of Zero expression to default-constructed array.
{
Array A;
A = Array::Zero(rows, cols);
VERIFY_IS_EQUAL(A.rows(), rows);
VERIFY_IS_EQUAL(A.cols(), cols);
}
// Assignment of Ones expression to default-constructed matrix.
{
Matrix M;
M = Matrix::Ones(rows, cols);
VERIFY_IS_EQUAL(M.rows(), rows);
VERIFY_IS_EQUAL(M.cols(), cols);
}
// Assignment of Random expression to default-constructed matrix.
{
Matrix M;
M = Matrix::Random(rows, cols);
VERIFY_IS_EQUAL(M.rows(), rows);
VERIFY_IS_EQUAL(M.cols(), cols);
}
// Assignment from another matrix to default-constructed matrix.
{
Matrix src = Matrix::Random(rows, cols);
Matrix dst;
dst = src;
VERIFY_IS_EQUAL(dst.rows(), rows);
VERIFY_IS_EQUAL(dst.cols(), cols);
VERIFY_IS_APPROX(dst, src);
}
// Vector assignment to default-constructed vector.
{
Vector v;
v = Vector::Zero(rows);
VERIFY_IS_EQUAL(v.size(), rows);
}
// RowVector assignment to default-constructed row vector.
{
RowVector v;
v = RowVector::Zero(cols);
VERIFY_IS_EQUAL(v.size(), cols);
}
// Array vector assignment to default-constructed array vector.
{
ArrayVector v;
v = ArrayVector::Zero(rows);
VERIFY_IS_EQUAL(v.size(), rows);
}
// Column access after Zero initialization (reproducer for reported bug).
{
Array A;
A = Array::Zero(rows, cols);
for (Index j = 0; j < cols; ++j) {
auto c = A.col(j);
VERIFY_IS_EQUAL(c.rows(), rows);
}
}
}
EIGEN_DECLARE_TEST(no_automatic_resizing) {
CALL_SUBTEST_1(testNoAutomaticResizing<float>());
CALL_SUBTEST_2(testNoAutomaticResizing<double>());
CALL_SUBTEST_3(testNoAutomaticResizing<std::complex<double>>());
}