小编mar*_*man的帖子

计算OpenCv中cv :: Mat的外(张量)乘积

有没有办法使用OpenCV中的数据结构计算外部产品(某些列向量z的z*transpose(z))?cv::Mat

我检查了文档,没有内置功能.但是我试图将标准矩阵乘法表达式(*)与类型向量一起使用时遇到异常cv::Mat.

这是(伪)代码:

cv::Mat tmp = cv::Mat::zeros(9, 1, CV_32SC1)
cv::Mat outerProduct = tmp * tmp.t();
Run Code Online (Sandbox Code Playgroud)

外部产品计算提供例外.(是的,我的实际代码中的tmp矩阵中有实际值,但此描述提供了有关所用数据类型的更多信息)

理想情况下,最终cv::Mat outerProduct应该是9x9矩阵.

我可以使用缩放倍增属性cv::Mat(即按列tmp尺寸重复列向量),对于每列,按索引中的值缩放元素 - 如同如何用手解决这种乘法一样:

cv::Mat outerProduct = cv::repeat(tmp, 1, 9);
for (int i = 0; i < 9; i++)
{
    outerProduct.col(i) *= tmp.at<int>(i, 0);
}
Run Code Online (Sandbox Code Playgroud)

...但如果有一个更好的方法会很好.

c++ opencv

3
推荐指数
1
解决办法
1529
查看次数

3D矩阵切片的2D卷积

我正在尝试在MATLAB中对矩阵进行一堆滚动求和.为了避免循环,我习惯repmat将2D矩阵分层为3D结构.但是,现在快速卷积功能conv2不能再用于累加器.然而,N维卷积函数(convn)不是我正在寻找的,因为它实际上卷积了所有3个维度.我想要在每个切片上进行2D卷积并返回3D矩阵的东西.

在2D中平铺矩阵而不是在3D中分层它们将无法工作,因为它会破坏卷积边缘情况.我可以在它们之间用零填充但是它开始变得有点混乱.

换句话说,如果没有for循环,我该如何执行以下操作:

A = ones(5,5,5);
B = zeros(size(A));
for i = 1 : size(A, 3)
    B(:,:,i) = conv2(A(:,:,i), ones(2), 'same');
end
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

matlab matrix convolution

3
推荐指数
1
解决办法
1710
查看次数

链接.lib文件时VC12命令行错误

我正在尝试使用包含库和链接库从VS2013命令窗口编译C ++程序。很标准的东西。但是,我对Microsoft 解释语法网站并不十分清楚。

我正在尝试以下命令:

cl /EHsc program.cpp /I "\path\to\includes"
    /LIBPATH:"\path\to\library\directory" /LINK libfile1.lib libfile2.lib
Run Code Online (Sandbox Code Playgroud)

注意:当我执行它时,它们全都在一行上,但是出于可读性考虑,我在这里将其拆分。

引号是因为路径中的某些目录中有空格,超出了我的控制范围(例如Program Files)。

我正在尝试从使用Visual Studio界面制作的属性表中改编此命令,因此,如果有帮助,我正在制作的映射为:

我在运行64位Windows 10的计算机上以x64本机工具命令提示符的身份运行此操作,但是,它给了我这些警告和错误:

cl: Command line warning D9002: ignoring unknown option '/LIBPATH:\path\to\library\directory'
cl: Command line warning D9002: ignoring unknown option '/LINK'
LINK : fatal error LNK1181: cannot open input file 'libfile1.lib'
Run Code Online (Sandbox Code Playgroud)

我要去哪里错了?

c++ linker compilation visual-studio-2013

3
推荐指数
1
解决办法
1008
查看次数

函数中void const*参数的用途

我正在尝试使用VLFeat中的库函数来调用数据为const void*.我真的不明白如何创建数据然后传入.

这是函数调用:

void vl_kmeans_init_centers_with_rand_data  (VlKMeans * self, void const * data,
    vl_size dimension, vl_size numData, vl_size numCenters)
Run Code Online (Sandbox Code Playgroud)

数据参数是抛出我的那个.我尝试构建一个随机数据矩阵来测试kmeans聚类函数,但我无法弄清楚如何使用这些数据.换句话说,这个函数需要这个参数.但是为了使它有用,我必须了解如何投射/创建/加载数据以使其工作.这意味着,我需要了解const void *参数中类型的用途.

任何帮助将受到高度赞赏.

注意:我确实理解const意味着什么,但是,例如,我无法弄清楚如何迭代地构建const数据(即填充具有双for循环的矩阵)

谢谢!

c++ vlfeat

2
推荐指数
1
解决办法
3849
查看次数

有没有办法在 Eigen (C++) 中存储阈值操作输出?

在 MATLAB 中,您可以通过对矩阵 A 进行阈值化来创建二进制矩阵 B,如下所示:

B = A > threshold
Run Code Online (Sandbox Code Playgroud)

哪里threshold有什么价值。在 C++ 的 Eigen 中,我能够看到类似的结果,但面临无法分配输出的问题。也就是说,给定

MatrixXd M =
0 1 2
0 1 2
0 1 2
Run Code Online (Sandbox Code Playgroud)

(我知道这不是正确的初始化,但为了这个问题,就这样吧)

cout << (M < 1)
Run Code Online (Sandbox Code Playgroud)

产生

1 0 0
1 0 0
1 0 0
Run Code Online (Sandbox Code Playgroud)

MatrixXd N = M < 1;
Run Code Online (Sandbox Code Playgroud)

M = M < 1;
Run Code Online (Sandbox Code Playgroud)

两者都会给出构建错误。

有人可以解释一下将此阈值的二进制输出保存到变量的正确方法吗?

c++ eigen

1
推荐指数
1
解决办法
1468
查看次数

从varagin将可变数量的字符串传递给MATLAB函数

我有一个函数,我接收参数作为参数的一部分varargin.但是,在该函数内是另一个函数调用varargin.如何varargin在不使用单元格数组的单元格数组的情况下将第一个内容传递给嵌套函数?

也就是说,给出以下代码:

function foo(varargin)
    bar(varargin)
end

function bar(varargin)
    % Do something with varargin
end

foo('ab', 'cdef')
Run Code Online (Sandbox Code Playgroud)

vararginbar(varargin)是含有1×2单元阵列是1x1单元阵列{'ab', 'cdef'}.

我正试着写一些东西:

foo('ab', 'cdef')
Run Code Online (Sandbox Code Playgroud)

可以bar(varargin)varargin只有1x2单元阵列的地方进行调用{'ab', 'cdef'}.

如何vararginfoo呼叫中的单元阵列的内容传输到呼叫中的单个参数bar

matlab variadic-functions cell-array

1
推荐指数
1
解决办法
121
查看次数

如何从类中返回大型向量而不复制数据

我正在编写一个程序,其中一个类有一个大的数据成员std::vector(大约100k - 1M项).其他类需要能够访问此向量.目前我有一个标准的访问器函数返回向量,但是这会返回我相信的向量的副本.我认为只返回迭代器或指向第一个元素的指针会有更多的内存和时间效率.但是,如果我这样做,那么如何使用这个指针来运行vector并知道何时停止(即向量结束的位置)?

我的代码看起来像这样:

class MyClass
{
    private:
        std::vector<MyObj> objects_;
        //...

    public:
        std::vector<MyObj> getObjects() { return objects_; }
        //...
}
Run Code Online (Sandbox Code Playgroud)

当我想要运行(模拟)连接向量时,这个问题以另一种形式出现.如果我有一个vectorMyClass,我希望能够遍历所有所包含的object_载体.我从这个答案中知道boost :: join做了我的想法,但我认为我需要返回副本才能正常工作.我可以返回一个指向向量的指针,并且仍然能够连续迭代它和其他人吗?

c++ vector c++11

1
推荐指数
1
解决办法
1152
查看次数

通过构造函数初始化成员函数

也许我对这个问题很陌生,但是是否可以通过构造函数定义成员函数?

就我而言,我正在尝试编写一个类来执行稳健的模型拟合(使用RANSAC)。我希望这可以推广到不同类型的模型。例如,我可以使用它来确定一个平面到一组 3D 点的估计。或者,也许我可以确定两组点之间的转换。在这两个示例中,可能需要不同的误差函数和不同的拟合函数。静态函数调用可能看起来像,而不是使用类

model = estimate(data, &fittingFunc, &errorFunc);
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以为这些模块化功能提供成员实例?

就像是

class Estimator
{
    private:
        // estimation params

        double errorFunc(std::vector<dtype>, double threshold); // Leave this unimplemented
        double fittingFunc(std::vector<dtype>, Parameters p); // Leave this unimplemented

    public:
        Estimator(void (*fittingFunc(std::vector<dtype>, Parameters), void (*errorFunc(std::vector<dtype>, double));

        dtype estimate(data); // Estimates model of type dtype. Gets implemented

};

Estimator::Estimator(void (*fittingFunc(std::vector<dtype>, Parameters), void (*errorFunc(std::vector<dtype>, double))
{
    fittingFunc = fittingFunc;
    errorFunc = errorFunc;
}
Run Code Online (Sandbox Code Playgroud)

我想我已经在我的例子中混杂了正确的语法,但我希望这个问题很清楚。基本上我在问:构造函数能否接受函数指针作为参数并将它们分配为成员函数的实现?

其次,即使这是可能的,它是否被认为是不良形式?

更新:如果有帮助,这里是用于稳健估计的 MATLAB 代码,它具有我希望在 C++ 中复制的这种可推广结构

c++ constructor function-pointers class

1
推荐指数
1
解决办法
264
查看次数