0

私は答えの1つを見ていました: ブーストベクトルまたはマトリックスを埋める ことですが、私はブースト(およびxcode、さらに言えば)が初めてで、ブーストzero_vectorに頭を悩ませようとしています。

答えの1つとほぼ同じだと思った簡単なプログラムを試しました:

#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>

int main (int argc, char * const argv[]) {
    // insert code here...
    using namespace boost::numeric::ublas;

    int gameSize = 9;

    typedef vector<int> possiblesVector;
    possiblesVector foo;
    foo.resize(gameSize);
    foo = zero_vector<int>(gameSize);
    std::cout << foo << std::endl;

    return 0;
}

これはコンパイルされますが、実行すると実行時エラーが発生します (実際のパスを「/PATH/TO」に置き換えます)。

Check failed in file /PATH/TO/boost_1_48_0/boost/numeric/ublas/detail/vector_assign.hpp at line 370:
detail::expression_type_check (v, cv)
terminate called after throwing an instance of 'boost::numeric::ublas::external_logic'
  what():  external logic or bad condition of inputs
Program received signal:  “SIGABRT”.
sharedlibrary apply-load-rules all

ここでは、単一の main.cpp をテスト領域として使用しています。実際のプログラムでは、宣言を .h ファイルに分割し、初期化をオブジェクトの .cpp ファイルに分割しています。しかし、上記のコードは実際のプログラムと同じように失敗します。(つまり、宣言と初期化を2つのステップに分割している理由)

また、サイズ変更がすでにゼロに初期化されていることも知っています。代わりにscalar_vectorを実行するか、後で配列をリセットする必要があるかもしれません。壊れているコードを分離しようとしていました。

4

1 に答える 1

0
    template<template <class T1, class T2> class F, class V, class E>
    // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it.
    void vector_assign (V &v, const vector_expression<E> &e, sparse_tag) {
        BOOST_UBLAS_CHECK (v.size () == e ().size (), bad_size ());
        typedef F<typename V::iterator::reference, typename E::value_type> functor_type;
        BOOST_STATIC_ASSERT ((!functor_type::computed));
        typedef typename V::value_type value_type;
#if BOOST_UBLAS_TYPE_CHECK
        vector<value_type> cv (v.size ());
        indexing_vector_assign<scalar_assign> (cv, v);
        indexing_vector_assign<F> (cv, e);
#endif
        v.clear ();
        typename E::const_iterator ite (e ().begin ());
        typename E::const_iterator ite_end (e ().end ());
        while (ite != ite_end) {
            value_type t (*ite);
            if (t != value_type/*zero*/())
                v.insert_element (ite.index (), t);
            ++ ite;
        }
#if BOOST_UBLAS_TYPE_CHECK
        if (! disable_type_check<bool>::value) 
            BOOST_UBLAS_CHECK (detail::expression_type_check (v, cv), 
                               external_logic ("external logic or bad condition of inputs"));
#endif
    }

ここで、v はあなたのものvector<int> possiblesVectorで、e は一時的なものですzero_vector<int>

// Weak equality check - useful to compare equality two arbitary vector expression results.
// Since the actual expressions are unknown, we check for and arbitary error bound
// on the relative error.
// For a linear expression the infinity norm makes sense as we do not know how the elements will be
// combined in the expression. False positive results are inevitable for arbirary expressions!
template<class E1, class E2, class S>
BOOST_UBLAS_INLINE
bool equals (const vector_expression<E1> &e1, const vector_expression<E2> &e2, S epsilon, S min_norm) {
    return norm_inf (e1 - e2) < epsilon *
           std::max<S> (std::max<S> (norm_inf (e1), norm_inf (e2)), min_norm);
}

template<class E1, class E2>
BOOST_UBLAS_INLINE
bool expression_type_check (const vector_expression<E1> &e1, const vector_expression<E2> &e2) {
    typedef typename type_traits<typename promote_traits<typename E1::value_type,
                                 typename E2::value_type>::promote_type>::real_type real_type;
    return equals (e1, e2, BOOST_UBLAS_TYPE_CHECK_EPSILON, BOOST_UBLAS_TYPE_CHECK_MIN);
}

機能をチェックします。

zero_vector の要素はすべて 0 なので、

    v.clear ();
    typename E::const_iterator ite (e ().begin ());
    typename E::const_iterator ite_end (e ().end ());
    while (ite != ite_end) {
        value_type t (*ite);
        if (t != value_type/*zero*/())
            v.insert_element (ite.index (), t);
        ++ ite;
    }

ベクトル v は空のままで、チェックは失敗しました。代わりにdoubleorを使用してみてください。floatint

于 2012-07-19T02:35:24.167 に答える