用2个方阵模拟matlab的mrdivide

2023-12-06

我有 2 个 19x19 方阵(a 和 b),我尝试使用斜杠(mrdivide)运算符来执行除法,这样

c = a / b

我正在尝试在 OpenCV 中实现这一点。我发现一些人建议使用cv::solve但到目前为止,我还没有找到任何可以给我提供接近 matlab 的结果的东西。

有谁知道我如何用 opencv 实现 mrdivide 吗?

我尝试过以下代码:

cv::Mat mldivide(const cv::Mat& A, const cv::Mat& B ) 
{
    //return  b * A.inv();
    cv::Mat a;
    cv::Mat b;
    A.convertTo( a, CV_64FC1 );
    B.convertTo( b, CV_64FC1 );

    cv::Mat ret;
    cv::solve( a, b, ret, cv::DECOMP_NORMAL );

    cv::Mat ret2;
    ret.convertTo( ret2, A.type() );
    return ret2;
}

然后我实现 mrdivide 如下:

cv::Mat mrdivide(const cv::Mat& A, const cv::Mat& B ) 
{
   return mldivide( A.t(), B.t() ).t();
}

(Edit:根据答案,当我正确使用它时,这实际上给了我正确的答案!)

这给了我一个错误的答案,即与 matlab 完全不同。根据评论我也尝试过

cv::Mat mrdivide(const cv::Mat& A, const cv::Mat& B ) 
{
    return A * B.inv();
}

这给出了与上面相同的答案,但也是错误的。


你不应该使用inv解决Ax=b or xA=b方程。虽然这两种方法在数学上是等效的(x=solve(A,b) and x=inv(A)*B),当使用浮点数时,这是完全不同的事情!http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/

作为基本规则,永远不要乘以矩阵逆。相反,对于一次性系统使用前向/后向斜杠运算符(或等效的“求解”方法),或者当您想要重用相同的矩阵时显式执行矩阵分解(例如 LU、QR、Cholesky 等)A与多个b's


我举一个具体的例子来说明反转的问题。我将使用 MATLAB 以及梅克斯开放病毒,一个允许我们直接从 MATLAB 调用 OpenCV 的库。

(这个例子借用自这个优秀的 FEX 提交作者:Tim Davis,他是 SuiteSparse 的开发者。我正在展示左除的情况Ax=b但这同样适用于右除xA=b).

我们首先构建一些矩阵Ax=b system:

% Ax = b
N = 16;                 % square matrix dimensions
x0 = ones(N,1);         % true solution
A = gallery('frank',N); % matrix with ill-conditioned eigenvalues
b = A*x0;               % Ax=b system

这是 16x16 矩阵A和 16x1 向量b看起来像(注意真正的解决方案x0只是一个由 1 组成的向量):

A =                                                          b =
   16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1              136
   15 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1              135
    0 14 14 13 12 11 10  9  8  7  6  5  4  3  2  1              119
    0  0 13 13 12 11 10  9  8  7  6  5  4  3  2  1              104
    0  0  0 12 12 11 10  9  8  7  6  5  4  3  2  1               90
    0  0  0  0 11 11 10  9  8  7  6  5  4  3  2  1               77
    0  0  0  0  0 10 10  9  8  7  6  5  4  3  2  1               65
    0  0  0  0  0  0  9  9  8  7  6  5  4  3  2  1               54
    0  0  0  0  0  0  0  8  8  7  6  5  4  3  2  1               44
    0  0  0  0  0  0  0  0  7  7  6  5  4  3  2  1               35
    0  0  0  0  0  0  0  0  0  6  6  5  4  3  2  1               27
    0  0  0  0  0  0  0  0  0  0  5  5  4  3  2  1               20
    0  0  0  0  0  0  0  0  0  0  0  4  4  3  2  1               14
    0  0  0  0  0  0  0  0  0  0  0  0  3  3  2  1                9
    0  0  0  0  0  0  0  0  0  0  0  0  0  2  2  1                5
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1                2

现在我们来比较一下cv::invert反对cv::solve通过使用 NORM 函数找到解并计算残差(或cv::norm如果你想):

% inverting (OpenCV)
x1 = cv.invert(A)*b;
r1 = norm(A*x1-b)

% inverting (MATLAB)
x2 = inv(A)*b;
r2 = norm(A*x2-b)

% solve using matrix factorization (OpenCV)
x3 = cv.solve(A,b);
r3 = norm(A*x3-b)

% solve using matrix factorization (MATLAB)
x4 = A\b;
r4 = norm(A*x4-b)

以下是找到的解决方案(我减去1这样你就可以看到它们离真正的解决方案有多远x0):

>> format short g
>> [x1 x2 x3 x4] - 1
ans =
   9.0258e-06   3.1086e-15  -1.1102e-16   2.2204e-16
   -0.0011101  -1.0181e-13  -2.2204e-15  -2.3315e-15
   -0.0016212  -2.5123e-12   3.3751e-14   3.3307e-14
    0.0037279   4.1745e-11  -4.3476e-13  -4.3487e-13
   -0.0022119   4.6216e-10   5.2165e-12    5.216e-12
   -0.0010476   1.3224e-09  -5.7384e-11  -5.7384e-11
    0.0035461   2.2614e-08   5.7384e-10   5.7384e-10
   -0.0040074  -4.1533e-07  -5.1646e-09  -5.1645e-09
    0.0036477   -4.772e-06   4.1316e-08   4.1316e-08
   -0.0033358   4.7499e-06  -2.8922e-07  -2.8921e-07
    0.0059112  -0.00010352   1.7353e-06   1.7353e-06
   -0.0043586   0.00044539  -8.6765e-06  -8.6764e-06
    0.0069238   -0.0024718   3.4706e-05   3.4706e-05
   -0.0019642   -0.0079952  -0.00010412  -0.00010412
    0.0039284      0.01599   0.00020824   0.00020823
   -0.0039284     -0.01599  -0.00020824  -0.00020823

最重要的是,以下是每种方法的错误:

r1 =
       0.1064
r2 =
     0.060614
r3 =
   1.4321e-14
r4 =
   1.7764e-15

最后两个准确度要高出几个数量级,甚至还差得远!这只是一个包含 16 个变量的系统。求逆在数值上不太可靠,尤其是当矩阵很大且稀疏时......


现在回答你的问题,你有正确的想法使用cv::solve,但是在右除的情况下,您刚刚弄错了操作数的顺序。

在 MATLAB 中,运算符/ and \ (or mrdivide and mldivide) 通过等式相互关联B/A = (A'\B')'(这是一个简单的结果转置属性).

因此,使用 OpenCV 函数,您可以编写(注意顺序)A and b):

% Ax = b
x = cv.solve(A, b);     % A\b or mldivide(A,b)

% xA = b
x = cv.solve(A', b')';  % b/A or mrdivide(b,A)

OpenCV 公开的 API 在这里有点尴尬,所以我们必须做所有这些转置。事实上,如果你参考相等的LAPACK 例程(思考DGESV or DGESVX)它们实际上允许您指定矩阵是否转置TRANS=T or not TRANS=N(在这个层面上,转置实际上只是不同的内存布局、C 或 Fortran 排序)。例如 MATLAB 提供了linsolve函数允许您在选项中指定这些东西......

(顺便说一句,在 C++ OpenCV 中编码时,我更喜欢使用函数形式的操作,例如cv::transpose与矩阵表达式变体相反Mat::t。前者可以就地操作,而后者会创建不必要的临时副本)。

现在,如果您正在寻找 C++ 中性能良好的线性代数实现,请考虑使用Eigen(它甚至与 OpenCV 完美集成)。另外,它是一个纯粹的基于模板的库,因此无需担心链接或二进制文件,只需包含头文件即可。


编辑(回应评论)

@Goz:

查找返回值优化。 “不必要的临时副本”不存在

我知道RVO and 移动语义,但这在这里并不重要;这cv::Mat类是易于复制不管怎样,有点像引用计数的智能指针。这意味着它仅在按值传递时进行浅复制并共享数据。为新副本创建的唯一部分是 mat 标头中的部分,这些部分在大小方面无关紧要(存储维度/通道数、步长和数据类型等内容)。

我说的是一个显式的深层副本,而不是您从函数调用返回时所考虑的副本......

感谢您的评论,它让我有动力真正深入研究 OpenCV 源代码,这不是最容易阅读的东西......代码几乎没有注释,有时可能很难理解。复杂性是可以理解的,因为 OpenCV 确实关心性能,而且许多功能以各种方式实现(常规 CPU 实现、循环展开版本、SIMD 矢量化版本(SSE、AVX、NEON 等)、并行和线程),这实际上令人印象深刻使用各种后端的版本、Intel IPP 的优化实现、使用 OpenCL 或 CUDA 的 GPU 加速版本、Tegra、OpenVX 等的移动加速版本)

让我们通过以下案例来追踪我们的步骤:

Mat A = ..., b = ..., x;
cv::solve(A.t(), b, x);

其中函数定义如下:

bool cv::solve(InputArray _src, InputArray _src2arg, OutputArray _dst, int method)
{
    Mat src = _src.getMat(), _src2 = _src2arg.getMat();
    _dst.create( src.cols, _src2.cols, src.type() );
    Mat dst = _dst.getMat();
    ...
}

现在我们必须弄清楚中间的步骤。我们首先拥有的是t会员方法:

MatExpr Mat::t() const
{
    MatExpr e;
    MatOp_T::makeExpr(e, *this);
    return e;
}

这会返回一个MatExpr这是一个允许延迟评估的类矩阵表达式。换句话说,它不会立即执行转置,而是存储对原始矩阵的引用以及最终对其执行的操作(转置),但它会推迟对其求值,直到绝对必要为止(例如当分配或转换为cv::Mat).

接下来我们看看相关部分的定义。请注意,在实际代码中,这些内容被分割到许多文件中。为了便于阅读,我只是将有趣的部分拼凑在一起,但这还远非完整的内容:

class MatExpr
{
public:
    MatExpr()
    : op(0), flags(0), a(Mat()), b(Mat()), c(Mat()), alpha(0), beta(0), s()
    {}
    explicit MatExpr(const Mat& m)
    : op(&g_MatOp_Identity), flags(0), a(m), b(Mat()), c(Mat()),
      alpha(1), beta(0), s(Scalar())
    {}
    MatExpr(const MatOp* _op, int _flags, const Mat& _a = Mat(),
            const Mat& _b = Mat(), const Mat& _c = Mat(),
            double _alpha = 1, double _beta = 1, const Scalar& _s = Scalar())
    : op(_op), flags(_flags), a(_a), b(_b), c(_c), alpha(_alpha), beta(_beta), s(_s)
    {}
    MatExpr t() const
    {
        MatExpr e;
        op->transpose(*this, e);
        return e;
    }
    MatExpr inv(int method) const
    {
        MatExpr e;
        op->invert(*this, method, e);
        return e;
    }
    operator Mat() const
    {
        Mat m;
        op->assign(*this, m);
        return m;
    }
public:
    const MatOp* op;
    int flags;
    Mat a, b, c;
    double alpha, beta;
    Scalar s;
}

Mat& Mat::operator = (const MatExpr& e)
{
    e.op->assign(e, *this);
    return *this;
}
MatExpr operator * (const MatExpr& e1, const MatExpr& e2)
{
    MatExpr en;
    e1.op->matmul(e1, e2, en);
    return en;
}

到目前为止,这很简单。该类应该将输入矩阵存储在a (again cv::Mat实例将共享数据,因此无需复制)以及要执行的操作op,以及其他一些对我们来说不重要的事情。

这是矩阵运算类MatOp,以及其中一些子类(我只显示转置和逆运算,但还有更多):

class MatOp
{
public:
    MatOp();
    virtual ~MatOp();
    virtual void assign(const MatExpr& expr, Mat& m, int type=-1) const = 0;
    virtual void transpose(const MatExpr& expr, MatExpr& res) const
    {
        Mat m;
        expr.op->assign(expr, m);
        MatOp_T::makeExpr(res, m, 1);
    }
    virtual void invert(const MatExpr& expr, int method, MatExpr& res) const
    {
        Mat m;
        expr.op->assign(expr, m);
        MatOp_Invert::makeExpr(res, method, m);
    }
}

class MatOp_T : public MatOp
{
public:
    MatOp_T() {}
    virtual ~MatOp_T() {}
    void assign(const MatExpr& expr, Mat& m, int type=-1) const
    {
        Mat temp, &dst = _type == -1 || _type == e.a.type() ? m : temp;
        cv::transpose(e.a, dst);
        if( dst.data != m.data || e.alpha != 1 ) dst.convertTo(m, _type, e.alpha);
    }
    void transpose(const MatExpr& e, MatExpr& res) const
    {
        if( e.alpha == 1 )
            MatOp_Identity::makeExpr(res, e.a);
        else
            MatOp_AddEx::makeExpr(res, e.a, Mat(), e.alpha, 0);
    }
    static void makeExpr(MatExpr& res, const Mat& a, double alpha=1)
    {
        res = MatExpr(&g_MatOp_T, 0, a, Mat(), Mat(), alpha, 0);
    }
};

class MatOp_Invert : public MatOp
{
public:
    MatOp_Invert() {}
    virtual ~MatOp_Invert() {}
    void assign(const MatExpr& e, Mat& m, int _type=-1) const
    {
        Mat temp, &dst = _type == -1 || _type == e.a.type() ? m : temp;
        cv::invert(e.a, dst, e.flags);
        if( dst.data != m.data ) dst.convertTo(m, _type);
    }
    void matmul(const MatExpr& e1, const MatExpr& e2, MatExpr& res) const
    {
        if( isInv(e1) && isIdentity(e2) )
            MatOp_Solve::makeExpr(res, e1.flags, e1.a, e2.a);
        else if( this == e2.op )
            MatOp::matmul(e1, e2, res);
        else
            e2.op->matmul(e1, e2, res);
    }
    static void makeExpr(MatExpr& res, int method, const Mat& m)
    {
        res = MatExpr(&g_MatOp_Invert, method, m, Mat(), Mat(), 1, 0);
    }
};

static MatOp_Identity g_MatOp_Identity;
static MatOp_T g_MatOp_T;
static MatOp_Invert g_MatOp_Invert;

OpenCV 大量使用运算符重载,因此各种操作,例如A+B, A-B, A*B, ...实际上映射到相应的矩阵表达式运算。

难题的最后一部分是代理类InputArray。它基本上存储了一个void*指针以及有关所传递事物的信息(它是什么类型:Mat, MatExpr, Matx, vector<T>, UMat等..),这样它就知道如何在请求时将指针强制转换回来,例如InputArray::getMat:

typedef const _InputArray& InputArray;

class _InputArray
{
public:
    _InputArray(const MatExpr& expr)
    { init(FIXED_TYPE + FIXED_SIZE + EXPR + ACCESS_READ, &expr); }

    void init(int _flags, const void* _obj)
    { flags = _flags; obj = (void*)_obj; }

    Mat getMat_(int i) const
    {
        int k = kind();
        int accessFlags = flags & ACCESS_MASK;
        ...
        if( k == EXPR ) {
            CV_Assert( i < 0 );
            return (Mat)*((const MatExpr*)obj);
        }
        ...
        return Mat();
    }
protected:
    int flags;
    void* obj;
    Size sz;
}

现在我们看看如何Mat::t创建并返回一个MatExpr实例。然后由cv::solve as InputArray。现在当它调用时InputArray::getMat为了检索矩阵,它有效地转换存储的MatExpr to a Mat调用强制转换运算符:

    MatExpr::operator Mat() const
    {
        Mat m;
        op->assign(*this, m);
        return m;
    }

所以它声明了一个新的矩阵m, calls MatOp_T::assign以新矩阵作为目标。反过来,这迫使它通过最终调用来进行评估cv::transpose。它将转置结果计算到这个新矩阵中作为目标。

所以我们最终有两份副本,原件A和转置的A.t()回。

现在,综上所述,将其与以下内容进行比较:

Mat A = ..., b = ..., x;
cv::transpose(A, A);
cv::solve(A, b, x);

在这种情况下,A被转置in-place,并且抽象级别较低。


现在我展示所有这些的原因不是为了争论这个额外的副本,毕竟这没什么大不了的:) 我发现的真正巧妙的事情是,以下两个表达式没有做相同的事情并给出不同的结果(而且我不是在谈论逆是否就地):

Mat A = ..., b = ..., x;
cv::invert(A,A);
x = A*b;

Mat A = ..., b = ..., x;
x = inv(A)*b;

事实证明,第二个实际上足够聪明,可以调用cv::solve(A,b)!如果你回到MatOp_Invert::matmul(当惰性求逆稍后与另一个惰性矩阵乘法链接时调用)。

void MatOp_Invert::matmul(const MatExpr& e1, const MatExpr& e2, MatExpr& res) const
{
    if( isInv(e1) && isIdentity(e2) )
        MatOp_Solve::makeExpr(res, e1.flags, e1.a, e2.a);
    ...
}

它检查表达式中的第一个操作数是否inv(A)*B是一个求逆运算,第二个操作数是一个恒等运算(即一个普通矩阵,而不是另一个复杂表达式的结果)。在这种情况下,它将存储的操作更改为惰性求解操作MatOp_Solve(这同样是一个包装器cv::solve功能)。 IMO 这非常聪明!尽管你写了inv(A)*b,它实际上不会计算逆矩阵,相反,它知道最好通过使用矩阵分解求解系统来重写它。

不幸的是,这只会有利于形式的表达inv(A)*b不是相反b*inv(A)(这最终会计算出逆数,这不是我们想要的)。所以在你解决的情况下xA=b,你应该坚持显式调用cv::solve...

当然,这仅适用于用 C++ 进行编码时(感谢运算符重载和惰性表达式的魔力)。如果您使用其他语言的 OpenCV 使用一些包装器(如 Python、Java、MATLAB),您可能不会得到任何这些,并且应该明确使用cv::solve就像我在之前的 MATLAB 代码中所做的那样,对于这两种情况Ax=b and xA=b.

希望这会有所帮助,对于这么长的帖子表示歉意;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用2个方阵模拟matlab的mrdivide 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • Firebase 规则:动态授予特定用户访问权限

    我正在构建一个 Android 应用程序 它需要我为用户存储一些图片 假设我有 2 个用户 A 和 B 他们应该能够读取 写入其特定文件夹 用户 A 可以读取和写入存储桶 images userA 用户 B 可以读取和写入存储桶 image
  • 选择下拉宽度 - Chrome 问题

    我想控制
  • unset 和 = null 之间的区别

    From a 随机 php net 帖子 如果你正在做 whatever null 那么你正在重写变量的 数据 您可能会更快地释放 缩小内存 但它可能会窃取 CPU 更快地从真正需要它们的代码中循环 从而产生 整体执行时间更长 显然这是无可
  • 使用 React Native 和 Tensorflow.js 对实时视频源进行预测

    我已经设置了我的 React Native 应用程序 所有 unimodules 和包的安装和配置都按预期工作 没有依赖性等问题 现在我想实现一个我从谷歌的可教机器上训练的张量流模型 但我无法理解如何将它与相机一起使用 因为我想实时处理帧
  • 如何使用Python解压gz文件

    我需要将从 FTP 站点下载的 gz 文件提取到本地 Windows 文件服务器 我已经为文件的本地路径设置了变量 并且我知道它可以被 GZIP muddle 使用 我怎样才能做到这一点 GZ 文件内的文件是 XML 文件 import g
  • 如何使 jQuery UI 选项卡出现在页面底部

    有没有办法让 jQuery UI 选项卡小部件选项卡出现在页面底部 使用 jQuery 站点中的示例
  • WebRTC 远程视频流不工作

    我添加了一个简单的 webRTC 应用程序 它将浏览器窗口连接到自身 从我的相机流式传输视频数据 最终目标是在页面上获取两个视频流 一个直接来自摄像头 另一个来自浏览器本地建立的 WebRTC 连接 不幸的是 远程视频流没有显示 知道为什么
  • 当我尝试测试我的应用程序时,Eclipse 无法识别我的 Android 平板电脑?

    最近我买了一台新的 Android 平板电脑 一款无名的中国平板电脑 我想测试我正在其上开发的应用程序 但是 当我尝试通过 Eclipse 运行它时 它无法识别我的平板电脑 平板电脑上启用了调试模式 当我看到选择设备对话框时 序列号 AVD
  • 使用角材料5上传文件

    我尝试使用角度材料 5 上传文件 角度 5 应用程序组件 html
  • 如何调试图表包“没有名为“plot”的模块”错误

    我正在一台 Windows 机器上使用 Anaconda 套件中的 Python3 和 IPython 笔记本 我跑了一个 pip install charts 安装软件包 我试图通过一些灵活和交互式的图表找到我的方法 任何建议表示赞赏 安
  • 使用 CMakeExternalProject_Add 构建 mongo-cxx-driver

    我正在尝试建立mongo cxx driver在基于 CMake 的项目中 该项目应该在 Windows macOS 和 ubuntu 容器中构建 我想确保所有这些平台上的软件将使用相同的驱动程序版本 因此我无法通过以下方式安装驱动程序及其
  • Java Runtime.getRuntime().exec() 似乎正在覆盖 $PATH

    对于一个自动化一些突变充分性测试的项目 我正在尝试从 Java 程序内部的源代码制作 GoLang 我已经能够从终端中的源代码中创建它 并尝试在 Java 中使用该命令Runtime getRuntime exec 命令 String en
  • 我们如何将 void_t 用于 SFINAE?

    我观看了 Walter Brown 在 Cppcon14 上关于现代模板编程的演讲 Part I Part II 他在那里展示了他的void tSFINAE 技术 Example 给定一个简单的变量模板 其计算结果为void如果所有模板参数
  • Retrofit + OkHTTP - 响应缓存不起作用

    我知道有很多类似的问题 但我已经阅读了所有这些问题 但没有一个真正有帮助 所以 这是我的问题 我正在使用 Retrofit okhttp 从 API 获取一些数据 我想缓存它们 不幸的是 我没有 API 服务器的管理员访问权限 因此无法修改
  • Google Glass 将视频流传输到服务器

    我正在尝试为 Google Glass 构建一个应用程序 它可以流式传输到服务器并让客户端通过网络浏览器查看流 到目前为止 我似乎需要通过 RTSP 到媒体服务器 例如 Wowza 执行此操作 然后拥有一个托管一些视频播放器的 Web 服务
  • 包含 url 值的 PHP 数组到包含组合值的新数组

    我已经尝试了很长时间 但找不到一种将数组合并到新数组的方法 大多数时候我迷失在循环和匹配中 我想收到一个可以执行以下操作的 php 5 方法 实施例1 假设有一个包含如下 url 的数组 Array a a b c a b c d e a
  • JSP - 如何在 session.setAttribute 中传递 javascript var? [复制]

    这个问题在这里已经有答案了 刚开始学习 JSP 并尝试在两个页面之间传递数据 我想知道是否可以将 javascript 变量传递给session setAttribute 目前 我可以通过 2 个 jsp 文件传递 一串文本 如下所示 JS
  • 如何修复 src 文件系统问题上的资源更改

    我正在尝试使用Hive关于 MR 执行SQL它中途失败并出现以下错误 Application application 1570514228864 0001 failed 2 times due to AM Container for app
  • 关于 PYTHONPATH 的 Python 2.x 多版本问题

    系统中安装了Python 2 6 现在我想使用Python 2 7中引入的模块 因为我没有root权限 所以我在我的主目录 HOME local 下构建并安装了2 7 我将以下内容添加到我的 HOME bashrc 中 export PAT
  • 用2个方阵模拟matlab的mrdivide

    我有 2 个 19x19 方阵 a 和 b 我尝试使用斜杠 mrdivide 运算符来执行除法 这样 c a b 我正在尝试在 OpenCV 中实现这一点 我发现一些人建议使用cv solve但到目前为止 我还没有找到任何可以给我提供接近