- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在研究粒度动力学问题。计算量大的部分是下面的函数,它求解二次方程来检测两个粒子的碰撞。
我想知道这是否可以轻松优化,或者我是否在做一些明显愚蠢的事情?例如,使用这些 const double x1 = p1->x;
结构来给编译器一个提示是不是一个好主意?查看汇编代码,编译器使用 SSE 指令,但我不知道它们是否在任何方面都是最优的(可能不是)。根据分析器,大部分时间花在计算表达式 a
、b
和 c
上。当您尝试优化某些核函数时(通常)您会做什么,如下所示?
void detect_collision_of_pair(struct particle* p1, struct particle* p2){
const double x1 = p1->x;
const double y1 = p1->y;
const double z1 = p1->z;
const double x2 = p2->x;
const double y2 = p2->y;
const double z2 = p2->z;
const double vx1 = p1->vx;
const double vy1 = p1->vy;
const double vz1 = p1->vz;
const double vx2 = p2->vx;
const double vy2 = p2->vy;
const double vz2 = p2->vz;
const double a = vx1*vx1 - 2.*vx1*vx2 + vx2*vx2 + vy1*vy1 - 2.*vy1*vy2 + vy2*vy2 + vz1*vz1 - 2.*vz1*vz2 + vz2*vz2;
const double b = 2.*vx1*x1 - 2.*vx2*x1 - 2.*vx1*x2 + 2.*vx2*x2 + 2.*vy1*y1 - 2.*vy2*y1 - 2.*vy1*y2 + 2.*vy2*y2 + 2.*vz1*z1 - 2.*vz2*z1 - 2.*vz1*z2 + 2.*vz2*z2;
const double c = -4.*particle_radius*particle_radius + x1*x1 - 2.*x1*x2 + x2*x2 + y1*y1 - 2.*y1*y2 + y2*y2 + z1*z1 - 2.*z1*z2 + z2*z2;
double root = b*b-4.*a*c;
if (root>=0.){
root = sqrt(root);
double time1 = (-b-root)/(2.*a);
double time2 = (-b+root)/(2.*a);
if ( (time1>-dt && time1<0.) || (time1<-dt && time2>0) ){
double times = -dt;
if (time1>-dt || time2<0){
if (time1>-dt){
times = time1;
}else{
times = time2;
}
}
resolve_collision(p1,p2,times);
}
}
}
最佳答案
为什么要展开所有方程式?这不是一个好主意。为什么不计算:
vx = v1x-v2x;
vy = v1y-v2y;
vz = v1z-v2z;
a = vx*vx + vy*vy + vz*vz;
这比您计算 a 的操作要少得多。可以对 b 和 c 执行相同类型的操作。您也可以对位置做类似的操作,即计算 px、py、pz 作为位置的差异,然后对它们进行平方。
另一方面,去掉所有那些 const 的东西,编译器不需要那些用于局部变量的东西。事实上,您可能不需要复制到局部变量,只需为您需要的东西创建局部变量,如上面的 vx、vy、vz。你在这里做的太多了,这就是代码花费太多时间的原因:-)
关于c - 关于优化浮点计算的建议 : solving a quadratic equation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5730751/
我正在使用 spyder - python。我想测试我的代码。我已关注 pip install spyder-unittest和 pip install pytest .我已经重新启动了内核并重新启动
我编写了一个简单的代码来匹配和选择/丢弃两个文件中的元素。此代码适用于包含 Id 对的 $file_in: Id1 Id2 Id1 Id3 Id1 Id4 Id3 Id4 Id3 Id5 Id3 Id
问题陈述:当 for 循环第二次执行时,我收到 Stale Element Exception。 描述: 我正在使用 for 循环来处理表元素。在第一次迭代中,它将在页面上搜索所需的元素。如果该元素在
我编写了一个简单的代码来匹配和选择/丢弃两个文件中的元素。此代码适用于包含 Id 对的 $file_in: Id1 Id2 Id1 Id3 Id1 Id4 Id3 Id4 Id3 Id5 Id3 Id
我正在尝试用 Java 创建康威的生命游戏,但似乎遇到了障碍。我创建了一个名为“Cell”的类,它包含一个 boolean 变量,该变量本质上确定细胞是活的还是死的,以及在需要时杀死或创建细胞的方法。
我有一张 table userid points expires我只想对所有匹配特定 userid 的点求和和 CURTIME() < expires . 所以我做到了: select *, su
题目地址:https://leetcode.com/problems/solve-the-equation/description/ 题目描述: Solve a given equation an
自从工作流构建问世以来,我一直在使用 TFS 构建。我从未见过使用以下任何一项的需要或愿望: Copy Build output to the server 什么服务器?什么目录? `将构建输出复制到
我有这个矩阵 a = {{2, -2, -4}, {-2, 5, -2}, {-4, -2, 2}} 然后我解出了一个缺少一项的方程。方程的形式为逆[p].a.p == q其中 p 是缺少条目 (x5
下面的代码解决了 hanoi 使用预定义函数 moveLOD、swapLOI 和 swapLID 返回 Action 列表的问题。 MoveLOD:将 1 个圆盘从第一个位置移动到三元组第三个位置中的
基本上,我通过从文本文件中读取一组整数来实现 AVL 树,然后使用 add() 方法填充树。另外,程序应该按顺序打印整数集。 当我运行该程序时,会弹出 StackOverflowError。我认为这个
我在 html 中有一个 span 标签,这个 可以在页面上多次出现。 我只想选择第一个跨度标签。我就是这样做的 var $myvar= $(".mydiv .indiv .myspan:first"
来自 sympy solve() 的解决方案是否以某种方式排序?它是从最小到最大的解决方案吗? 如何强制解决方案的非负性? 在我的问题中,我需要独特的最小正解决方案。我感谢所有的帮助 最佳答案 它们不
我正在尝试打开一个文件,但我收到了: 该进程无法访问该文件,因为它正被另一个进程使用。该文件是一个 XML 文档。谁能帮忙? string activeDirectory = @"X:\SubGr
如何解决此内存泄漏...我什至在最后释放它,如图片所示,但它仍然存在。在 if 语句几乎 10-15 条件下,它像给定的代码一样使用......但最后我发布了它。 LoginResponse *res
我为不同的日子编写了以下代餐代码,但我每天都吃同样的餐。我想隔天吃“肉”和“素食”食物。 my dataframe is as follows: id name
这会创建一个点列表,sympy solve() 方法应该返回 x 的值。相反,它返回另一个方程式,我不确定为什么。 ogrid() 和 ravel() 正在绘图中创建一个点列表,这是在 Matplot
只是好奇它是否使用高斯消去法或其他等效方法? 最佳答案 来自numpy docs : solve is a wrapper for the LAPACK routines dgesv and zges
首先, solve_poly_system( seq, *gens, **args), 有人确切知道solve_poly_system的参数是什么意思吗? 我有系统, rd = λk ua = λk
我正在尝试使用 sympy 的 solve 命令求解方程,但我的输出是一个空列表 [ ]。我认为这可能发生的唯一原因是没有解决方案,但我怀疑这就是原因。任何人都知道为什么我没有得到答案?谢谢! fro
我是一名优秀的程序员,十分优秀!