我查看了STL源代码std::move_iterator<Iterator>,发现它返回了Iterator::value_type&&.当Iterator::referencer值与r值不同时,这会导致不正确的行为Iterator::value_type&.
我有一个代理对象的类reference(如in std::vector<bool>),可以隐式转换为value_type.普通迭代器只是解释引用此代理(输入迭代器要求允许这样做),但std::move_iterator调用转换为value_type开销,然后返回对创建的临时对象的悬空引用.
std::move_iteratorstd::vector<bool>由于某种原因仍然可以使用(可能因为bool是一个简单的类型,悬空bool&&不会导致错误),但不是我的班级.这让我感到困惑,我不明白如何解决它,我认为这是STL中的一个错误.
以下是std::move_iteratorGCC 4.8.1 的简化源代码:
template <typename Iterator>
class move_iterator {
public:
typedef typename iterator_traits<Iterator>::value_type value_type;
typedef value_type&& reference;
reference operator*() const {
return std::move(*it);
}
private:
Iterator it;
};
Run Code Online (Sandbox Code Playgroud) 我试图通过匹配SIFT描述符并通过RANSAC查找转换矩阵来搜索输入图像中的特定对象.该对象只能通过2D空间中的相似变换(缩放,旋转,平移)在场景中进行修改,因此我需要在3D空间中估计2x2变换矩阵而不是3x3单应矩阵.我怎样才能在OpenCV中实现这一目标?
opencv image-processing computer-vision homography affinetransform
我发现无法提取对boost::any包含派生类型的基类型的引用:
boost::any holder = Derived();
const Base& base_ref = boost::any_cast<const Base&>(holder);
Run Code Online (Sandbox Code Playgroud)
抛出一个boost::bad_any_cast例外.
这似乎是违反Liskov替代原则并不是很方便.有没有解决方法?
我正在使用OpenCV实现Bag-of-Words图像分类器.最初我测试了在SURF关键点中提取的SURF描述符.我听说Dense SIFT(或PHOW)描述符可以更好地用于我的目的,所以我也尝试过它们.
令我惊讶的是,他们表现得更差,实际上差了近10倍.我能做错什么?我正在使用OpenCV的DenseFeatureDetector获取关键点.我从9层中提取每个图像大约5000个描述符,并将它们聚类成500个簇.
我应该从VLFeat库中尝试PHOW描述符吗?此外,我不能在OpenCV的SVM实现中使用chi square内核,这在许多论文中都是推荐的.这对分类器质量至关重要,我应该尝试另一个库吗?
另一个问题是尺度不变性,我怀疑它可能受到密集特征提取的影响.我对吗?
线性SVM的预测复杂度是多少?它的分离面只是一个超平面,所以预测时间似乎不应该取决于训练数据.与此同时,我读到复杂性与支持向量的数量成正比.将所有这些支持向量保留在训练有素的分类器中有什么意义?
我不理解LIBLINEAR的API中偏差参数的含义.为什么在培训期间由用户指定?它不应该只是从分离超平面到原点的距离,它是学习模型的参数吗?
这来自README:
struct problem
{
int l, n;
int *y;
struct feature_node **x;
double bias;
};
Run Code Online (Sandbox Code Playgroud)
如果bias> = 0,我们假设在每个数据实例的末尾添加了一个附加功能.
这个附加功能是什么?
我正在使用OneVsRestClassifier进行多标签分类.它适用于LinearSVC,但是当我将其应用于SVC时,会出现以下错误:
classifier = OneVsRestClassifier(SVC(class_weight='balanced'))
classifier.fit(X1, y1)
y2 = classifier.predict(X2)
Traceback (most recent call last):
...
File "/usr/local/lib/python2.7/dist-packages/sklearn/multiclass.py", line 219, in predict
return predict_ovr(self.estimators_, self.label_binarizer_, X)
File "/usr/local/lib/python2.7/dist-packages/sklearn/multiclass.py", line 93, in predict_ovr
Y = np.array([_predict_binary(e, X) for e in estimators])
File "/usr/local/lib/python2.7/dist-packages/sklearn/multiclass.py", line 66, in _predict_binary
score = estimator.predict_proba(X)[:, 1]
File "/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py", line 490, in predict_proba
"probability estimates must be enabled to use this method")
NotImplementedError: probability estimates must be enabled to use this method</code>
Run Code Online (Sandbox Code Playgroud)
有人知道它是什么吗?
我正在尝试通过 scikit-learn (sklearn.feature_selection.SelectKBest) 中的卡方方法进行特征选择。当我尝试将其应用于多标签问题时,我收到以下警告:
UserWarning: Duplicate scores. Result may depend on feature ordering.There are probably duplicate features, or you used a classification score for a regression task.
warn("Duplicate scores. Result may depend on feature ordering."
为什么会出现这种情况以及如何正确应用特征选择?
我的虚函数可以返回单个T或std::vector<T>.boost::variant<T, std::vector<T>>在这种情况下返回是一个好主意还是总是返回std::vector<T>?哪个看起来更好,性能开销最小?返回单个值时使用变量会更快吗?
如何从模板函子包装器返回任意类型(void或non-void)?我使用包装器用于前置条件和后置条件,因此我需要在从包装器返回之前将返回值存储在局部变量中.但是当返回的类型为void时,编译器会给出错误,因为变量不能具有void类型.这可以做什么?
template <typename Functor, typename... Args>
auto Decorate(Functor f, Args&&... args)
-> decltype(f(std::forward<Args>(args)...)) {
// preconditions
const auto result = f(std::forward<Args>(args)...);
// postconditions
return result;
}
Run Code Online (Sandbox Code Playgroud) c++ ×4
boost ×2
c++11 ×2
opencv ×2
scikit-learn ×2
svm ×2
boost-any ×1
chi-squared ×1
homography ×1
iterator ×1
liblinear ×1
libsvm ×1
polymorphism ×1
stl ×1
templates ×1
type-erasure ×1