小编oar*_*ish的帖子

Common Lisp:为什么我的尾递归函数导致堆栈溢出?

我在理解Common Lisp函数的性能时遇到了问题(我仍然是新手).我有这个函数的两个版本,它只是计算所有整数的总和n.

非尾递归版:

(defun addup3 (n) 
  (if (= n 0)
    0   
    (+ n (addup (- n 1)))))
Run Code Online (Sandbox Code Playgroud)

尾递归版:

(defun addup2 (n) 
  (labels ((f (acc k)
              (if (= k 0)
                   acc 
                   (f (+ acc k) (- k 1)))))
  (f 0 n)))
Run Code Online (Sandbox Code Playgroud)

我试图在输入CLISP中运行这些函数n = 1000000.这是结果

[2]> (addup3 1000000)
500000500000
[3]> (addup2 1000000)

*** - Program stack overflow. RESET
Run Code Online (Sandbox Code Playgroud)

我可以在SBCL中成功运行,但非尾递归的更快(只有一点点,但这对我来说似乎很奇怪).我已经搜索了Stackoverflow问题的答案,但找不到类似的东西.为什么我的堆栈溢出虽然尾递归函数被设计为不将所有递归函数调用放在堆栈上?我是否必须告诉解释器/编译器优化尾调用?(我读过类似(proclaim '(optimize (debug 1))设置调试级别并以追踪能力为代价进行优化的内容,但我不知道这是做什么的).也许答案是显而易见的,代码是胡说八道,但我无法弄清楚.感谢帮助.

编辑:danlei指出了拼写错误,它应该是addup3在第一个函数中调用,所以它是递归的.如果纠正,两个版本都会溢出,但不是他的版本

(defun addup (n) 
         "Adds up the first N integers"
         (do ((i …
Run Code Online (Sandbox Code Playgroud)

clisp tail-recursion sbcl common-lisp

8
推荐指数
2
解决办法
5170
查看次数

基本矩阵的T和R估计

我创建了一个简单的测试应用程序,用于从基本矩阵执行平移(T)和旋转(R)估计.

  1. 生成50个随机.
  2. 计算投影pointSet1.
  3. 通过矩阵(R | T)转换.
  4. 计算新的投影点Set2.
  5. 然后计算基本矩阵˚F.
  6. E = K2^T F K1(K1, K2- 内部相机矩阵)提取基本矩阵.
  7. 使用SVD获取UDV^T.

并计算restoredR1 = UWV^T,restoredR2 = UW^T.并看到他们中的一个设置为初始[R .

但是,当我计算平移矢量,restoredT = UZU^T我得到规范化的牛逼.

restoredT*max(T.x, T.y, T.z) = T

如何恢复正确的翻译载体?

opencv linear-algebra computer-vision

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

如何在 Sphinx :class: 指令后添加复数-s

我一直有这个问题,我想写一个这样的文档字符串:

def foo(arg):
   '''Add ``arg`` to the list of :class:`foo.bar.baz.Argument`s.'''
   pass
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,Sphinx 会警告说

py:class reference target not found: foo.bar.baz.Argument`s
Run Code Online (Sandbox Code Playgroud)

所以它将s结束反引号之后的作为类名的一部分。这不会发生在像点这样的标点符号上.。除了在类名和 Plural-s 之间添加一个空格(看起来很疯狂)之外,还有什么可以做的吗?

python-3.x python-sphinx

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

如何使点(graphviz)垂直而不是水平布局未连接的节点?

我用来pyreverse从 python 代码创建类图,这会产生如下图:

在此输入图像描述

可以看出,有些类是不相关的。我希望将子图放在彼此下方,以便我可以将图像包含在文档中。

是否有一种简单的方法来修改点文件,以便将图形的断开部分放置在彼此下方?

dot graphviz pyreverse

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

为什么SURF特征点有浮点坐标?

我刚刚编写了 C++ OpenCV 2.4.7 代码来使用 SurfFeatureDetector 提取立体图像中的特征点。它工作得很好,但是当我意识到点坐标是浮点时我感到困惑,例如它发现坐标 [283.23 123.424] 作为左图像中的特征之一。

这是代码的一部分(简单地提取特征):

int minHessian = 400;

SurfFeatureDetector detector(minHessian);
vector<KeyPoint> featuresLeft, featuresRight;

detector.detect(leftImg, featuresLeft);
detector.detect(rightImg, featuresRight);
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这是怎么发生的?内置函数是否涉及任何插值?

opencv image-processing feature-extraction feature-detection

5
推荐指数
0
解决办法
668
查看次数

相机姿态估计:如何解释旋转和平移矩阵?

假设我在两个图像之间有良好的对应关系并尝试恢复它们之间的相机运动.我可以使用OpenCV 3的新设施,如下所示:

 Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 1, mask);

 int inliers = recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask);

 Mat mtxR, mtxQ;
 Mat Qx, Qy, Qz;
 Vec3d angles = RQDecomp3x3(R, mtxR, mtxQ, Qx, Qy, Qz);

 cout << "Translation: " << t.t() << endl;
 cout << "Euler angles [x y z] in degrees: " << angles.t() << endl;
Run Code Online (Sandbox Code Playgroud)

现在,我无法绕过什么R,t实际上是什么意思.它们是将坐标从相机空间1映射到相机空间2所需的变换,如同p_2 = R * p_1 + t

考虑这个例子,用地面实况手动标记对应关系

在此输入图像描述

我得到的输出是这样的:

Translation: [-0.9661243151855488, -0.04921320381132761, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv computer-vision coordinate-transformation structure-from-motion

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

计算两个通道中复杂数据的协方差矩阵(无复杂数据类型)

我在矩阵的 2 个通道中给出了复数值数据(一个是实部,一个是虚部,因此矩阵维度是(height, width, 2),因为 Pytorch 没有原生复数数据类型。我现在想要计算协方差矩阵。适用于 Pytorch 的精简 numpy 计算如​​下:

def cov(m, y=None):

    if m.ndimension() > 2:
        raise ValueError("m has more than 2 dimensions")

    if y.ndimension() > 2:
        raise ValueError('y has more than 2 dimensions')

    X = m
    if X.shape[0] == 0:
        return torch.tensor([]).reshape(0, 0)
    if y is not None:
        X = torch.cat((X, y), dim=0)

    ddof = 1

    avg = torch.mean(X, dim=1)

    fact = X.shape[1] - ddof

    if fact <= 0:
        import warnings
        warnings.warn("Degrees of freedom <= …
Run Code Online (Sandbox Code Playgroud)

python covariance complex-numbers matrix-multiplication pytorch

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

如何使用git repos作为PyPi包的依赖项?

我有一个要推送到PyPi的程序包,某些功能不是程序包,而是可安装的git存储库。我requirements.txt看起来像这样

sphinx_bootstrap_theme>=0.6.5
matplotlib>=2.2.0
numpy>=1.15.0
sphinx>=1.7.5
sphinx-argparse>=0.2.2
tensorboardX
tqdm>=4.24.0
Cython>=0.28.5

# git repos
git+git://github.com/themightyoarfish/svcca-gpu.git
Run Code Online (Sandbox Code Playgroud)

因此,我setup.py具有以下内容:

#!/usr/bin/env python

from distutils.core import setup
import setuptools
import os

with open('requirements.txt', mode='r') as f:
    requirements = f.read()
    required_pkgs, required_repos = requirements.split('# git repos')
    required_pkgs = required_pkgs.split()
    required_repos = required_repos.split()

with open('README.md') as f:
    readme = f.read()

setup(name=...
      ...
      packages=setuptools.find_packages('.', include=[...]),
      install_requires=required_pkgs,
      dependency_links=required_repos,
      zip_safe=False,   # don't install egg, but source
)
Run Code Online (Sandbox Code Playgroud)

但是运行pip install <package>实际上并不会安装git依赖项。我认为pip实际上并没有使用安装脚本。当我python setup.py install手动运行时,它可以工作。 …

python git pip pypi

5
推荐指数
2
解决办法
255
查看次数

为什么无法在 C++ 中创建 std::set&lt;const std::string&gt; ?

我有一个包含std::set<const std::string>成员的类,它在 macOS 上的 Clang 10.0.1 中编译得很好,但在 GCC 5.4.0 中却没有。下面的 MRE

#include <set>
#include <string>

class Foo {
  std::set<const std::string> bar; ///<--- error ‘const _Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::const_reference) const [with _Tp = const std::__cxx11::basic_string<char>; __gnu_cxx::new_allocator<_Tp>::const_pointer = const std::__cxx11::basic_string<char>*; __gnu_cxx::new_allocator<_Tp>::const_reference = const std::__cxx11::basic_string<char>&]’ cannot be overloaded

public:
  Foo() {}
};

int main(int argc, char *argv[]) {
  Foo f;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器调用:

/usr/bin/g++ -std=c++11 test.cpp
Run Code Online (Sandbox Code Playgroud)

相反,如果我使用非常量,string它会起作用。这是过时的标准库版本的问题吗?

c++ gcc compiler-errors clang c++11

5
推荐指数
0
解决办法
70
查看次数

当内存对齐问题 (AVX) 无法在最小上下文中重现时,如何调试它们?

我最近总是遇到以下问题:

  1. 我有一个大型代码库,它使用EigenPCL(也使用Eigen
  2. 我需要使用几乎最新的 Eigen master 分支,并且由于依赖项需要它而无法使用稳定版本。
  3. 我的项目中的 PCL 和其他依赖项都使用向量指令,因此我使用-march=native.
  4. 当运行一些涉及特征类型(仿射变换、点云查看)的东西时,我有时会在看似无意义的位置(例如在构造函数中)出现分段错误或其他崩溃Eigen::Quaternionf。在其他情况下,会EIGEN_UNALIGNED_ASSERT触发 ,这会导致此页面,我在代码中随处观察到其内容(据我所知)

我想成为一个好公民,所以我尝试在一个最小的示例上重现该问题,并将其发布在 stackoverflow 或相关问题跟踪器中。然而,当我只提取触发问题的位时,我总是无法重现崩溃。我的猜测是,内存是否对齐(并且不需要特别注意)也取决于问题位置之前分配的内容,因此周围的代码有助于触发问题。

问题:我可以使用哪些技术和工具来有效确定 Linux 和/或 macOS 上的 C+14 中内存对齐相关崩溃的根源?

c++ debugging memory-alignment point-cloud-library eigen3

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