小编all*_*llo的帖子

如何在 ceres 中为同一解决方案创建不同的求解器块?

我想用ceres来计算三角形坐标。

对于这个问题,我需要解决网格中的网格坐标。每个三角形都有自己的顶点,但可以使用三角形(3 个顶点)和边(4 个顶点)等结构。

示例数据(伪代码):

triangles = [[v1, v2, v3], [v4, v5, v6]]
inner_edges = [[[v1, v4], [v2, v5]]]
Run Code Online (Sandbox Code Playgroud)

[v1, v2][v4, v5]最初是相同的,在求解过程中可能会发生变化。

现在我有两个成本函数,一个在三角形上,一个在内边缘上

f([v1, v2, v3]) = res_t1
g([v1, v4, v2, v5]) = res_2
Run Code Online (Sandbox Code Playgroud)

有两种简单的块结构

  • 两个块,一个包含所有三角形残差,一个包含所有边残差。
  • 每个三角形一个块,每个边一个块。

第一个求解具有x所有坐标的向量(2*|V|因为每个顶点有两个坐标),因为块依赖于所有顶点。在第二个中,三角形块应该仅依赖于三个顶点,而边缘块应该依赖于四个顶点。我现在想使用第二个,因为我期望更好的性能和更好的收敛性。

如何设置 ceres 来求解相同的坐标,但仅考虑与当前残差相关的顶点子集?

我尝试使用大小 6 和 8 以及位于正确位置的指针来设置问题x,但 ceres 不允许使用具有不同偏移量的相同结果指针。

接下来我尝试使用SubsetParameterization这样的例子

vector<double> x(mesh.n_faces()*6);
for(int i=0; i < mesh.n_faces(); i++){
    vector<int> const_params;
    for(int j = 0; j < mesh.n_faces(); …
Run Code Online (Sandbox Code Playgroud)

c++ nonlinear-optimization ceres-solver

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

我可以为C ++类提供不完整的标题以隐藏实现细节吗?

我想将一个类实现分为三个部分,以避免用户需要处理实现细节,例如,我用来实现功能的库:

impl.cpp

#include <api.h>
#include <impl.h>
Class::Class() {
    init();
}
Class::init() {
    myData = SomeLibrary::Type(42);
}
Class::doSomething() {
    myData.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

展示次数

#include <somelibrary.h>
class Class {
public:
    Class();
    init();
    doSomething();
private:
    SomeLibary::Type myData;
}
Run Code Online (Sandbox Code Playgroud)

api.h

class Class {
    Class();
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

问题是,不允许我为类定义重新定义标题。当我定义这不起作用Class(),并doSomething()只在api.h,无论是。


一个可能的选择是定义api.h它,并且根本不在项目中使用它,而是安装它(而不安装impl.h)。

最明显的缺点是,我需要确保,在常见的方法api.h,并impl.h始终具有相同的签名,否则使用库会得到链接错误,在编译库时,我无法预测程序。

但是,这种方法是否会奏效,还是会由于obj文件与标头不匹配而引起其他问题(例如,指向类成员的指针错误或类似问题)?

c++ api-design include

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

如何加快字符串格式化速度?

我想从包含较小字符串的对象列表中创建一个长字符串。一个简化的例子是聊天记录:

class Line:
    def __init__(self, user, msg):
        self.user = user
        self.msg = msg
Run Code Online (Sandbox Code Playgroud)

现在我尝试创建一个日志:

log = []
for line in lines:
    log.append("{0}: {1}".format(log.user, log.msg))
log_str = "\n".join(log)
Run Code Online (Sandbox Code Playgroud)

在一台快速机器上,我每秒只能得到大约 50000 行(根据tqdm)。

我尝试的替代方案只是连接字符串:

log.append(log.user + ": " + log.msg + "\n")
Run Code Online (Sandbox Code Playgroud)

或者直接将其附加到log_str,两者都比较慢。

据我所知,连接速度更快"\n".join(string_list),但如何加快创建线路的速度呢?

python string

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

两个不同的眼睛表情符号?

据我所知,目前有两个眼睛表情符号.一对眼睛(U + 1F440)带有十六进制代码f09f9180(),一只眼睛(U + 1F441)带十六进制代码f09f9181().

我现在发现在我的手机中使用键盘的表情符号时,存在另一个眼睛表情符号,带有十六进制代码f09f9181efb88f(️).

PC上的gajim信使和手机上的Conversations应用程序都可以显示两者.gajim表情符号选择器只包含短序列和Swiftkey-Keyboard Emoji-Chooser只有较长的序列.

当我复制并粘贴表情符号时,即在Firefox URL地址栏中,它们看起来是一样的(蓝眼睛,而信使都以黑色显示它们).当我使用Google表示emojis时,我只找到描述较短代码点的页面.

Firefox渲染两个emojis相同,但Vivaldi(基于Chromium)显示具有较短代码点的那个作为窄黑色和白色表情符号而另一个作为较大的棕色眼睛.

当我使用Google进行十六进制转储时,我会发现很多用于较短转储的表情符号网站,对于较长的转储没有任何用处.

有没有关于额外的表情符号的文档?为什么两个表情符号选择器都不能使用表情符号?

unicode emoji

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

最近的 C++ 编译器会自动检测重复的数学运算吗?

假设我有以下代码:

const int n = fun1();
const double x = fun2();
for(int i=0; i < n; i++) {
    double y = fun3(i) / std::sqrt(x);
    double z = fun4(i) / std::sqrt(x);
    // Do something with the values, e.g., assign them to an array outside the loop
}
Run Code Online (Sandbox Code Playgroud)

最近的编译器是否设法将其优化为

const int n = fun1();
const double x = fun2();
const double sqrtx = std::sqrt(x); // only computed once instead of possibly 2*n times
for(int i=0; i < n; i++) {
    double y …
Run Code Online (Sandbox Code Playgroud)

c++ optimization

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