如何创建常量增强矩阵?

发布于 2024-08-27 04:44:49 字数 146 浏览 11 评论 0原文

如何创建常量增强矩阵?

以下内容无效:

const boost::numeric::ublas::matrix<double> arrayM(1, 3) = { {1.0, 2.0, 3.0} };

How can I create a const boost matrix?

The following did not work:

const boost::numeric::ublas::matrix<double> arrayM(1, 3) = { {1.0, 2.0, 3.0} };

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玻璃人 2024-09-03 04:44:49

通常类似于:

typedef boost::numeric::ublas::matrix<double> matrix_type;

const matrix_type get_matrix(void)
{
    matrix_type result(1, 3);
    result(0, 0) = 1;
    result(0, 1) = 2;
    result(0, 2) = 3;

    return result;
}

const matrix_type arrayM = get_matrix();

您也可以尝试这样的事情(大部分未经测试):

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

template <typename T, typename L = boost::numeric::ublas::row_major,
            typename A = boost::numeric::ublas::unbounded_array<T> >
class matrix_builder
{
public:
    // types
    typedef boost::numeric::ublas::matrix<T, L, A> matrix_type;
    typedef typename matrix_type::size_type size_type;

    // creation
    matrix_builder(size_type pRows, size_type pColumns) :
    mMatrix(pRows, pColumns),
    mRow(0),
    mColumn(0)
    {}

    matrix_builder& operator()(const T& pValue)
    {
        mMatrix(mRow, mColumn) = pValue;
        if (++mColumn == mMatrix.size2())
        {
            mColumn = 0;
            mRow++;
        }

        return *this;
    }

    // access
    operator const matrix_type&(void) const
    {
        return mMatrix;
    }

private:
    // non copyable
    matrix_builder(const matrix_builder&);
    matrix_builder& operator=(const matrix_builder&);

    // members
    matrix_type mMatrix;
    size_type mRow;
    size_type mColumn;
};

typedef boost::numeric::ublas::matrix<double> matrix_type;

static const matrix_type m1 = matrix_builder<double>(3, 1)
                                (1)(2)(3);

static const matrix_type m2 = matrix_builder<double>(3, 3)
                                (1)(2)(3)
                                (4)(5)(6)
                                (7)(8)(9);

int main(void)
{
    std::cout << m1 << std::endl;
    std::cout << m2 << std::endl;
}

相同的想法,更通用。还有一点视觉效果,这很好。

Usually something akin to:

typedef boost::numeric::ublas::matrix<double> matrix_type;

const matrix_type get_matrix(void)
{
    matrix_type result(1, 3);
    result(0, 0) = 1;
    result(0, 1) = 2;
    result(0, 2) = 3;

    return result;
}

const matrix_type arrayM = get_matrix();

You might also try something like this (mostly untested):

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

template <typename T, typename L = boost::numeric::ublas::row_major,
            typename A = boost::numeric::ublas::unbounded_array<T> >
class matrix_builder
{
public:
    // types
    typedef boost::numeric::ublas::matrix<T, L, A> matrix_type;
    typedef typename matrix_type::size_type size_type;

    // creation
    matrix_builder(size_type pRows, size_type pColumns) :
    mMatrix(pRows, pColumns),
    mRow(0),
    mColumn(0)
    {}

    matrix_builder& operator()(const T& pValue)
    {
        mMatrix(mRow, mColumn) = pValue;
        if (++mColumn == mMatrix.size2())
        {
            mColumn = 0;
            mRow++;
        }

        return *this;
    }

    // access
    operator const matrix_type&(void) const
    {
        return mMatrix;
    }

private:
    // non copyable
    matrix_builder(const matrix_builder&);
    matrix_builder& operator=(const matrix_builder&);

    // members
    matrix_type mMatrix;
    size_type mRow;
    size_type mColumn;
};

typedef boost::numeric::ublas::matrix<double> matrix_type;

static const matrix_type m1 = matrix_builder<double>(3, 1)
                                (1)(2)(3);

static const matrix_type m2 = matrix_builder<double>(3, 3)
                                (1)(2)(3)
                                (4)(5)(6)
                                (7)(8)(9);

int main(void)
{
    std::cout << m1 << std::endl;
    std::cout << m2 << std::endl;
}

Same idea, more generic. Also a bit more visual, which can be nice.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文