我正在使用 numpy einsum 计算形状为 (3,N) 的列向量 pts 数组与其自身的点积,从而产生形状为 (N,N) 的矩阵点积,以及所有点积。这是我使用的代码:
dotps = np.einsum('ij,ik->jk', pts, pts)
Run Code Online (Sandbox Code Playgroud)
这有效,但我只需要主对角线上方的值。IE。结果的上三角部分没有对角线。是否可以使用 einsum 仅计算这些值?或者以任何其他方式比使用 einsum 计算整个矩阵更快?
我的 pts 数组可能非常大,所以如果我只能计算我需要的值,那么我的计算速度就会加倍。
我要用matplotlib绘制的每个点都有3d点和表面法线的列表。列表大小为千分之一。
我可以轻松地绘制点,但是在绘制线(以显示法线)时,我尝试了3种方法,但均未获得理想的结果。
第一种方法是按照此问题的解决方案遍历每行。这可行,但是非常慢。
第二种方法似乎适用于2d图,是在给定图的x,y列表中隔行扫描“ Nones”。就像本网站介绍的最后一种方法一样。但是,在3d中绘图时,这似乎不起作用。
我尝试过的第三种方法(对于2d效果很好)是使用LineCollection。但是,当我传递3d点时,它会引发异常,并抱怨“'顶点'必须是形状为Nx2的2D列表或数组”。因此,LineCollection似乎不支持3d。
有人知道如何使用matplotlib有效地绘制大量3d线段吗?
与我之前的问题相关联. 使用Cython包装一个使用OpenCV类型作为参数的C++类
现在我陷入了另一个错误.我的OpenCV类型Matx33d的cython包装代码如下所示:
cdef extern from "opencv2/core/core.hpp" namespace "cv":
cdef cppclass Matx33d "cv::Matx<double, 3, 3>":
Matx33d()
Matx33d(double v0, double v1, double v2, double v3, double v4, double v5, double v6, double v7, double v8)
double& operator()(int i, int j)
Run Code Online (Sandbox Code Playgroud)
然后我定义了一个函数来将Matx33d复制到一个numpy数组.
cdef Matx33d2numpy(Matx33d &m):
cdef np.ndarray[np.double_t, ndim=2] np_m = np.empty((3,3), dtype=np.float64)
np_m[0,0]= m(0,0); np_m[0,1]= m(0,1); np_m[0,2]= m(0,2)
np_m[1,0]= m(1,0); np_m[1,1]= m(1,1); np_m[1,2]= m(1,2)
np_m[2,0]= m(2,0); np_m[2,1]= m(2,1); np_m[2,2]= m(2,2)
return np_m
Run Code Online (Sandbox Code Playgroud)
当我编译cython包装器时,我得到了这些错误
geom_gateway.cpp(2528) error C3861: '()': identifier not found
Run Code Online (Sandbox Code Playgroud)
这对应于第一次使用Matx33d :: …
我正在尝试使用Cython包装使用某些OpenCV类型作为参数的C ++类,然后打算从Python使用此包装的类。C ++类的简化版本如下所示:
“ transform.h”
#include "opencv2/core/core.hpp"
namespace geom
{
class Transform
{
public:
Transform(cv::Vec3d &euler, cv::Vec3d &t);
void set_euler(cv::Vec3d &euler);
cv::Vec3d get_euler();
}
}
Run Code Online (Sandbox Code Playgroud)
Vec3d在OpenCV中定义为:
template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
typedef Vec<double, 3> Vec3d;
Run Code Online (Sandbox Code Playgroud)
Matx定义为:
template<typename _Tp, int m, int n> class Matx {...};
Run Code Online (Sandbox Code Playgroud)
我对cython包装器的第一次尝试是这样的:
“ geom_gateway.pyx”
cdef extern from "opencv2/core/core.hpp" namespace "cv":
cdef cppclass Matx[_Tp, int m, int n]:
Matx()
Matx(_Tp v0, _Tp v1, _Tp v2)
cdef extern from "opencv2/core/core.hpp" namespace …Run Code Online (Sandbox Code Playgroud)