投掷 vnl_matrix<int> 和 vnl_matrix<double>的最佳方法

best method to cast bewteen vnl_matrix<int> and vnl_matrix<double>

本文关键字:matrix vnl 最佳 方法 int 投掷 double      更新时间:2023-10-16

在C++中,我有一个返回一个vnl_matrix<int>和一个需要vnl_matrix<double>作为输入的第二个类。除了在双循环中逐个转换矩阵的每个元素之外,有没有一种简单的方法可以从vnl_matrix<int>转换为vnl_matrix<double>

编辑:基于另一个矩阵的矩阵的构造函数如下所示(我没有写它,有关详细信息,请参阅此处。是否可以修改此构造函数以允许"复制/转换"

//: Creates a new matrix and copies all the elements.
// O(m*n).
template <class T>
vnl_matrix<T>::vnl_matrix (vnl_matrix<T> const& from)
: num_rows(from.num_rows), num_cols(from.num_cols)
{
  vnl_matrix_construct_hack();
  if (from.data && from.data[0]) {
    vnl_matrix_alloc_blah();
    T const *src = from.data[0];
    vcl_copy( src, src + this->num_rows * this->num_cols, this->data[0] );
  }
  else {
    num_rows = 0;
    num_cols = 0;
    data = 0;
  }
}

将一个强制转换为另一个的唯一方法是,如果你有这样的构造函数:

template <typename T>
class vnl_matrix {
    // conversion
    template <typename U,
              typename = std::enable_if<std::is_convertible<U,T>::value>::type>
    vnl_matrix(const vnl_matrix<U>& rhs);
};

据推测,该构造函数会将矩阵中的所有单元格转换为循环。但是您必须添加它 - 没有默认机制。同样,请注意,也无法从vector<int>"转换"到vector<unsigned int> - 您必须在那里手动构建一个新向量。