用遗物提升矩阵

Posted

技术标签:

【中文标题】用遗物提升矩阵【英文标题】:boost matrix with relic 【发布时间】:2013-09-03 20:08:24 【问题描述】:

我正在尝试使用 fb_t 的 boost 矩阵,它是一个 relic 对象,表示有限域的元素。以下是文档中 fb_t 的定义方式:

typedef uint64_t dig_t
typedef align dig_t fb_t[FB_DIGS+PADDING(FB_BYTES)/(FB_DIGIT/8)]

这是我的代码:

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

extern "C" 
#include <relic.h>

#include "relic_test.h"

using namespace std;
typedef boost::numeric::ublas::matrix<fb_t> matrix;

int main(void) 
    core_init();
    fb_param_set_any();
    fb_param_print();

    matrix mat(2,2);

   core_clean();
   return 0;

我收到以下错误:

Compiling: main.cpp
In file included from /usr/include/boost/numeric/ublas/vector.hpp:19:0,
                 from /usr/include/boost/numeric/ublas/matrix.hpp:16,
                 from /home/Foo/main.cpp:2:
/usr/include/boost/numeric/ublas/storage.hpp: In instantiation of ‘boost::numeric::ublas::unbounded_array<T, ALLOC>::unbounded_array(boost::numeric::ublas::unbounded_array<T, ALLOC>::size_type, const ALLOC&) [with T = unsigned int [4]; ALLOC = std::allocator<unsigned int [4]>; boost::numeric::ublas::unbounded_array<T, ALLOC>::size_type = unsigned int]’:
/usr/include/boost/numeric/ublas/matrix.hpp:131:92:   required from ‘boost::numeric::ublas::matrix<T, L, A>::matrix(boost::numeric::ublas::matrix<T, L, A>::size_type, boost::numeric::ublas::matrix<T, L, A>::size_type) [with T = unsigned int [4]; L = boost::numeric::ublas::basic_row_major<>; A = boost::numeric::ublas::unbounded_array<unsigned int [4], std::allocator<unsigned int [4]> >; boost::numeric::ublas::matrix<T, L, A>::size_type = unsigned int]’
/home/Foo/main.cpp:21:19:   required from here
/usr/include/boost/numeric/ublas/storage.hpp:71:23: error: functional cast to array type ‘boost::numeric::ublas::unbounded_array<unsigned int [4], std::allocator<unsigned int [4]> >::value_type aka unsigned int [4]’
/usr/include/boost/numeric/ublas/storage.hpp: In instantiation of ‘static void boost::numeric::ublas::unbounded_array<T, ALLOC>::iterator_destroy(T*&) [with T = unsigned int [4]; ALLOC = std::allocator<unsigned int [4]>; boost::numeric::ublas::unbounded_array<T, ALLOC>::iterator = unsigned int (*)[4]]’:
/usr/include/boost/numeric/ublas/storage.hpp:106:25:   required from ‘boost::numeric::ublas::unbounded_array<T, ALLOC>::~unbounded_array() [with T = unsigned int [4]; ALLOC = std::allocator<unsigned int [4]>]’
/usr/include/boost/numeric/ublas/matrix.hpp:90:11:   required from here
/usr/include/boost/numeric/ublas/storage.hpp:290:13: error: request for member ‘~boost::numeric::ublas::unbounded_array<unsigned int [4], std::allocator<unsigned int [4]> >::value_type’ in ‘* i’, which is of non-class type ‘unsigned int [4]’

我不太确定错误消息是关于什么的。任何的想法?

【问题讨论】:

我不认为boost::ublas 支持数组作为值类型。该错误消息让我认为它正在尝试执行类似ValueType(value) 的操作,如果ValueType 是一个数组,则这是无效的,因为无法复制数组。 @DavidBrown 我怀疑有类似的事情。你对如何解决这个问题有什么建议吗? 您可以将fb_t 包装在一个可以正确构造和复制它的类中。或者您可以将其替换为 std::array @DavidBrown 正是我害怕的。就我而言,编写自己的矩阵类似乎不那么痛苦。感谢您的回复。如果您将其转发为答案,我会接受。 【参考方案1】:

我认为 boost::ublas 不支持将数组作为值类型。错误消息可能是因为数组不可复制。为了解决这个问题,您可以将 fb_t 包装在一个类中:

struct fb_t_wrapper 
    fb_t value;
;

或使用std::array

using fb_t_array = std::array<dig_t, FB_DIGS+PADDING(FB_BYTES)/(FB_DIGIT/8)>;

【讨论】:

以上是关于用遗物提升矩阵的主要内容,如果未能解决你的问题,请参考以下文章

矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法 | ICML 2021

填充提升向量或矩阵

如何将矩阵提升到具有多个线程的幂?

如何让提升池访问 gsl 矩阵以线程化任务

使用循环平铺转置大型二维矩阵没有性能提升

基于OpenMP的矩阵乘法实现及效率提升分析