2017-11-06 9 views
1

C++でこのエラーが発生しました。私は、マルチ配列でStrassen行列の乗算を実装しようとしています。私は同じ次元の配列に別の配列を割り当てます。 このようにA11[i][j][k] = A[i][j][k]。理由はそんなものだと思う。multi_array boost libraryエラー?

Assertion failed: (size_type(idx - index_bases[0]) < extents[0]), function access, file /usr/local/Cellar/boost/1.65.1/include/boost/multi_array/base.hpp, line 136. Abort trap: 6

理由を知っていますか?このエラーは何を意味しますか?

typedef boost::multi_array<int_type, 3> array_type; 
array_type::extent_gen extents; 

array_type A(boost::extents[size][size][noc]); 
array_type B(boost::extents[size][size][noc]); 
array_type C(boost::extents[size][size][noc]); 

std::fill(A.origin(), A.origin() + A.num_elements(), 0); 
std::fill(B.origin(), B.origin() + B.num_elements(), 0); 
std::fill(C.origin(), C.origin() + C.num_elements(), 0); 

array_type Strr(int size,int noc,array_type A,array_type B, array_type C) { 

    if(size == 2) { //2-order 
     C=Matrix_Multiply(size,noc, A, B, C); 

    } else { 
     // 
     for(int i=0; i<size/2; i++) { 
      for(int j=0; j<size/2; j++) { 
       for(int k=0; k<noc; j++) { 

       A11[i][j][k] = A[i][j][k] ; 

       A12[i][j][k] = A[i][j+size/2][k] ; 

     } 

    } 

} 

私のコードは次のとおりです。問題の内容はわかりません。

エラー:アサーションに失敗しました:(size_type(idx-index_base [0])<エクステント[0])、関数アクセス、ファイル/usr/local/Cellar/boost/1.65.1/include/boost/multi_array/base .HPP、あなたが持っている最も内側のループではライン136

+1

何を「私は理由はラインのようなものだと思う」を平均?何が起こっているのかを確認するコードを投稿するのはどうですか? – MrJLP

+0

(私は思う)このエラーの理由はこのコードの断片です。 A11 [i] [j] [k] = A [i] [j] [k]行列を別の行列に割り当てる。 A11とAは同じ寸法です。 –

+1

あなたは何が起こっているのかを人々が理解できるように、より多くのコードを投稿する必要があります。 https://stackoverflow.com/help/mcve – MrJLP

答えて

0

:あなたは++k代わりの++jを意味している必要があります

 for (int k = 0; k < noc; j++) { 

:私はSをいただきたい

 for (int k = 0; k < noc; ++k) { 

メインをも含意:

int dim[] = {size,size,noc}; 
array_type A(dim), B(dim), C(dim); 

デフォルトでは値の初期化が行われます。

multi_arrayのアイデアは、配列ではなく、あなたが別のパラメータ(sizenoc例えば)渡すので、自己記述していることである:

array_type Strr(array_type A, array_type B) { 
    static_assert(array_type::dimensionality == 3, "static invariant"); 
    size_t size = A.shape()[0]; 
    size_t noc = A.shape()[2]; 

    assert(A.shape()[0] == A.shape()[1]); 
    assert(std::equal_range(A.shape(), A.shape()+3, B.shape())); 
    assert(std::equal_range(A.shape(), A.shape()+3, C.shape())); 
関連する問題