Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++使用存储在堆上的数组填充对称矩阵_C++_Arrays_Pointers_Boost_Std - Fatal编程技术网

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

C++使用存储在堆上的数组填充对称矩阵,c++,arrays,pointers,boost,std,C++,Arrays,Pointers,Boost,Std,我正在尝试构建一个代码,其中我必须在堆中声明一个大数组。 同时,我将使用boost库执行一些矩阵计算,如中所示 我在这里的局限性有两个:我将处理大型数组和矩阵,因此我必须声明堆中的所有内容,并且我必须处理数组,而不是向量 然而,对于许多人来说,我面临着一个相当琐碎的问题。。。填充矩阵时,最后一个元素没有正确填充。所以虽然我希望 [3,3]0,1,3,1,2,4,3,4,5 代码的输出是 [3,3]0,1,3,1,2,4,3,4,2.6681e-315 我正在编译这段代码。我不认为这与此有关,我只

我正在尝试构建一个代码,其中我必须在堆中声明一个大数组。 同时,我将使用boost库执行一些矩阵计算,如中所示

我在这里的局限性有两个:我将处理大型数组和矩阵,因此我必须声明堆中的所有内容,并且我必须处理数组,而不是向量

然而,对于许多人来说,我面临着一个相当琐碎的问题。。。填充矩阵时,最后一个元素没有正确填充。所以虽然我希望

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

代码的输出是

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

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

下面是代码的一个小示例

#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


通过将&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

为什么您希望指针具有成员函数?使用std::vector或其他STL容器:-@Jarod42谢谢您的评论!我不能使用std::vector,因为在更大的项目中,我必须使用一些不使用std::vector@Thanos这绝对不是真的。你可以用vector::data获取向量的底层数组。对于编译时常量大小的数组,您可以使用std::array,它提供迭代器、复制赋值和其他功能。@Caleth:非常感谢您的回答!因为我是新手,所以我不太明白你的意思…以及如何在代码中实现它。再次感谢你!我已经编辑了这个问题,以说明为什么我需要填充->开始地址,这是为了填充对称矩阵。在这种情况下,我认为float const*in1=filler;还是我又错了?
#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;
}