【问题标题】:c++ - Fill a symmetric matrix using an array stored on the heapc++ - 使用存储在堆上的数组填充对称矩阵
【发布时间】:2018-02-22 16:59:41
【问题描述】:

我正在尝试构建一个代码,我必须在堆中声明一个大数组。 同时我会使用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;
}

知道如何解决这个问题吗?

【问题讨论】:

  • 你为什么期望一个指针有成员函数?
  • 使用std::vector或其他STL容器:-)
  • @Jarod42 感谢您的评论!我不能使用std::vector,因为在更大的项目中,我必须使用一些不使用std::vector的功能
  • @Thanos 这绝对不是真的。
  • 您始终可以使用vector::data() 获取向量的底层数组。对于编译时常量大小的数组,您可以使用std::array,它提供了迭代器、复制分配和其他好东西。

标签: c++ arrays pointers boost std


【解决方案1】:

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

float const* in1 = filler; // adding const is always allowed

【讨论】:

  • @Caleth:非常感谢您的回答!问题是由于我是新手,我不太明白你的意思......以及如何在代码中实现它。
  • 再次非常感谢您!我已经编辑了这个问题,以说明为什么我需要filler-&gt;begin() 地址,它是为了填充一个对称矩阵。在这种情况下,我认为float const* in1 = filler; 还是我又错了?
【解决方案2】:

我终于通过将&amp;filler[5] 更改为&amp;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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2011-03-12
    • 1970-01-01
    • 2018-05-16
    • 2019-04-28
    • 1970-01-01
    相关资源
    最近更新 更多