c ++ - 使用存储在堆上的数组填充对称矩阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c ++ - 使用存储在堆上的数组填充对称矩阵相关的知识,希望对你有一定的参考价值。

我正在尝试构建一个代码,我必须在堆中声明一个大型数组。同时我将使用boost库执行一些矩阵计算(可以在Fill a symmetric matrix using an array 中看到)。

我的局限是两个:我将处理大型数组和矩阵,所以我必须在堆上声明所有内容,我必须使用数组而不是向量。

然而,对于许多人来说,我面临着相当微不足道的问题......当填充矩阵时,最后一个元素无法正确填充。所以虽然我希望得到

[3,3]((0,1,3),(1,2,4),(3,4,5))

代码的输出是

[3,3]((0,1,3),(1,2,4),(3,4,2.6681e-315))

我在ROOT6编译这段代码。我不认为这与此有关,我只是提到完成。

下面是一小段代码

#include <iterator>
#include <iostream>
#include <fstream>

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

using namespace std;

int test_boost () {

    using namespace boost::numeric::ublas;
    symmetric_matrix<double, upper> m_sym1 (3, 3);

    float* filler = new float[6];
    for (int i = 0; i<6; ++i) filler[i] = i;
    float const* in1 = filler;

    for (size_t i = 0; i < m_sym1.size1(); ++ i)
        for (size_t j = 0; j <= i && in1 != &filler[5]; ++ j)
            m_sym1 (i, j) = *in1++;
    delete[] filler;
    std::cout << m_sym1 << std::endl;
    return 0;
}

关于如何解决这个问题的任何想法?

答案

数组和指针不是类类型的对象,它们没有成员。你已经有了float *,它是filler

float const* in1 = filler; // adding const is always allowed
另一答案

我已经通过将&filler[5]改为&filler[6]来最终解决它。所以有效的版本如下所示

#include <iterator>
#include <iostream>
#include <fstream>

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

using namespace std;

int test_boost () {

    using namespace boost::numeric::ublas;
    symmetric_matrix<double, upper> m_sym1 (3, 3);

    float* filler = new float[6];
    for (int i = 0; i<6; ++i) filler[i] = i;
    float const* in1 = filler;

    for (size_t i = 0; i < m_sym1.size1(); ++ i)
        for (size_t j = 0; j <= i && in1 != &filler[6]; ++ j)
            m_sym1 (i, j) = *in1++;
    delete[] filler;
    std::cout << m_sym1 << std::endl;
    return 0;
}

运行此代码会产生以下输出

[3,3]((0,1,3),(1,2,4),(3,4,5))

以上是关于c ++ - 使用存储在堆上的数组填充对称矩阵的主要内容,如果未能解决你的问题,请参考以下文章

在堆上创建数组并用指针寻址它们

在堆上存储 3D 数组作为结构成员

使用数组填充对称矩阵

C++中,静态数组在内存中是存储在堆上,还是栈上,还是在静态存储区中?

堆上的 C++ 数组声明?

在堆上“分解” c++ 数组是不是安全?