这个问题可能是一个愚蠢的问题,但我真的很好奇.
在玩过像HL2,GMod或者愤怒的小鸟这样的游戏,并使用像Box2D这样的物理库之后,我开始怀疑"物理引擎如何模拟物理?"
像词法和语法分析器用于编译时理解代码,并使用光线跟踪渲染3D场景,我认为有一些概念(比碰撞检测等),它们在物理引擎来模拟物理,如计算力矩和五边形进行桶滚动的速度.
物理引擎如何实际模拟物理?使用了什么概念?网上是否有关于制作像这样的物理引擎的"教程" ,它展示了光线追踪?
我正在创建自己的BigInt类,通过将数字分成7位数.(即基数10,000,000)
我实现了加法,减法和乘法,现在我正在实现除法和mod.我编写了一个代码,通过长除法进行除法(通过除以最高有效数字来估算数字),并且它有效.
但是,它太慢了.当我测试108位数和67位数的运算时,计算除法需要1.9ms,比其他运算慢得多(计算加法/减法0.007~0.008ms,计算乘法0.1ms).
与用于快速乘法的Karatsuba和FFT算法一样,存在用于计算除法的算法?维基百科演示了一些除法算法(计算除数的乘法逆,并将其乘以除数),但我认为这对我实施除法没有多大帮助.我也阅读了"大整数方法"部分,但这对我也没有帮助...... :(
两天前,当我发现jsperf.com收集了许多javascript性能测试时,我浏览了几个测试.
其中一个测试是这样,与之相比,Math.min(a,b)VS a<b?a:b.当我在谷歌浏览器上运行此测试时,结果证明它a<b?a:b比Math.min(a,b)(在Chrome 14上,第一个53,661,381 ops/s和第二个419,830,711 ops/s)快得多.其他Web浏览器也有类似的结果.
但是,在Firefox上,结果是相反的.Math.min(a,b)要快得多a<b?a:b!第一个是374,219,869 ops/s第二个,第二个是79,490,749 ops/s在Firefox 6上.

当我在Facebook上发布此消息时,有人说"由于Firefox是开源项目,开发人员进行了优化Math.min,但谷歌Chrome没有,因为谷歌Chrome只是Chromium的修改",但(除了以上声明并不完全正确)这没有任何意义,因为这并不能解释为什么谷歌Chrome a<b?a:b和Firefox Math.min(a,b)以相似的速度运行,而谷歌Chrome Math.min(a,b)和Firefox的a<b?a:b速度相同,因为如果Firefox比谷歌Chrome更快,那么谷歌Chrome Math.min(a,b)应该比Firefox的a<b?a:b.
摘要:
a<b?a:b速度比Math.min(a,b).Math.min(a,b)速度要快于a<b?a:b.Math.min(a,b)Firefox上的速度≒ a<b?a:b谷歌Chrome的速度和a<b?a:bFirefox上的速度≒ Math.min(a,b)谷歌Chrome 的速度,"Firefox很慢"或"Firefox很快"不能成为原因.有没有理由(如何)这种情况发生?
简而言之,我想做的与这个问题类似:Convert RGB image to index image,但我想要获取 n 通道图像,而不是 1 通道索引图像,其中img[h, w]是 one-hot 编码向量。例如,如果输入图像为[[[0, 0, 0], [255, 255, 255]],索引 0 分配给黑色,索引 1 分配给白色,则所需的输出为[[[1, 0], [0, 1]]]。
就像上一个人问的问题一样,我天真地实现了这个,但是代码运行得很慢,我相信使用 numpy 的正确解决方案会明显更快。
另外,正如上一篇文章中所建议的,我可以将每个图像预处理为灰度并对图像进行单热编码,但我想要一个更通用的解决方案。
假设我想将白色分配给 0,红色分配给 1,蓝色分配给 2,黄色分配给 3:
(255, 255, 255): 0
(255, 0, 0): 1
(0, 0, 255): 2
(255, 255, 0): 3
Run Code Online (Sandbox Code Playgroud)
,我有一个由这四种颜色组成的图像,其中图像是一个 3D 数组,其中包含每个像素的 R、G、B 值:
[
[[255, 255, 255], [255, 255, 255], [255, 0, 0], [255, 0, 0]],
[[ 0, 0, …Run Code Online (Sandbox Code Playgroud) 例如,如果数组是这样的0 0 0 0 ... 0 0[n]s o m e d a t a 4 9 9 9 9 9 9 8 3 7 ...,如何将指针移动n,而不是s o m e d a t a 4 9 9 9 ...在指针移动后改变?
该问题是:
对于正整数n,将f(n)定义为n的最小正数,用基数10表示,仅使用数字≤2.
因此f(2)= 2,f(3)= 12,f(7)= 21,f(42)= 210,f(89)= 1121222.
为了在Mathematica中解决它,我编写了一个f计算f(n)/ n的函数:
f[n_] := Module[{i}, i = 1;
While[Mod[FromDigits[IntegerDigits[i, 3]], n] != 0, i = i + 1];
Return[FromDigits[IntegerDigits[i, 3]]/n]]
Run Code Online (Sandbox Code Playgroud)
原理很简单:0, 1, 2使用三元数字系统枚举所有数字,直到其中一个数除以n.
它正确地给出11363107了1~100,并且我测试了1~1000(计算花了大约一分钟,然后给出111427232491),所以我开始计算问题的答案.
但是,这种方法太慢了.计算机已经计算了两个小时的答案并且还没有完成计算.
如何改进我的代码以更快地计算?
我对编译器,解析器和解析器生成器感兴趣,但我对它们知之甚少.
在阅读了这个问题的答案之后,我尝试制作一个"非常"简单的LaTeX解析器.
这是代码:
grammar Latex;
latex : ITEM*;
ITEM : CMD|LAWTEXT;
CMD : CHEAD ARGS;
CHEAD : '\\' LETTER(LETTER|DIGIT)*;
LETTER : 'A'..'Z'|'a'..'z';
DIGIT : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
ARGS : '{' ITEM* '}';
LAWTEXT : (LETTER|DIGIT|WHITESPACE|PUNC)*;
WHITESPACE
: ' '|'\t'|'\n'|'\r';
PUNC : '!'|'^';
Run Code Online (Sandbox Code Playgroud)
(PUNC中只有两个字符用于测试目的)
这是错误消息:
[18:39:09] warning(200): C:\Users\***\Documents\Latex.g:9:12: Decision can match input such as "{'\t'..'\n', '\r', ' '..'!', '0'..'9', 'A'..'Z', '\\', '^', 'a'..'z', '}'}" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[18:39:09] error(201): …Run Code Online (Sandbox Code Playgroud) javascript ×2
algorithm ×1
antlr ×1
antlrworks ×1
biginteger ×1
brainfuck ×1
firefox ×1
image ×1
numpy ×1
optimization ×1
parsing ×1
performance ×1
python ×1