c++ - 使用存储在堆上的数组填充对称矩阵
c++ - Fill a symmetric matrix using an array stored on the heap
我正在尝试构建一个代码,其中我必须在堆中声明一个大数组。
同时我会使用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;
}
知道如何解决这个问题吗?
数组和指针不是class类型的对象,它们没有成员。您已经有一个 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))
我正在尝试构建一个代码,其中我必须在堆中声明一个大数组。
同时我会使用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;
}
知道如何解决这个问题吗?
数组和指针不是class类型的对象,它们没有成员。您已经有一个 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))