【发布时间】:2011-09-20 19:00:15
【问题描述】:
double data[12] = {1, z, z^2, z^3, 1, y, y^2, y^3, 1, x, x^2, x^3};
double result[64] = {1, z, z^2, z^3, y, zy, (z^2)y, (z^3)y, y^2, z(y^2), (z^2)(y^2), (z^3)(y^2), y^3, z(y^3), (z^2)(y^3), (z^3)(y^3), x, zx, (z^2)x, (z^3)x, yx, zyx, (z^2)yx, (z^3)yx, (y^2)x, z(y^2)x, (z^2)(y^2)x, (z^3)(y^2)x, (y^3)x, z(y^3)x, (z^2)(y^3)x, (z^3)(y^3)x, x^2, z(x^2), (z^2)(x^2), (z^3)(x^2), y(x^2), zy(x^2), (z^2)y(x^2), (z^3)y(x^2), (y^2)(x^2), z(y^2)(x^2), (z^2)(y^2)(x^2), (z^3)(y^2)(x^2), (y^3)(x^2), z(y^3)(x^2), (z^2)(y^3)(x^2), (z^3)(y^3)(x^2), x^3, z(x^3), (z^2)(x^3), (z^3)(x^3), y(x^3), zy(x^3), (z^2)y(x^3), (z^3)y(x^3), (y^2)(x^3), z(y^2)(x^3), (z^2)(y^2)(x^3), (z^3)(y^2)(x^3), (y^3)(x^3), z(y^3)(x^3), (z^2)(y^3)(x^3), (z^3)(y^3)(x^3)};
- 在给定数据的情况下,产生结果的最快(最少执行)是什么?假设 数据 的大小是可变的,但始终是 4 倍(例如,4、8、12 等)。
- 没有提升。我试图保持我的依赖小。 STL 算法没问题。
- 提示:结果数组大小应始终为 4^(倍数大小)(例如,4、16、64 等)。
- 奖励:如果您可以计算 result 刚刚给定 x, y, z
其他示例:
double data[4] = {1, z, z^2, z^3};
double result[4] = {1, z, z^2, z^3};
double data[8] = {1, z, z^2, z^3, 1, y, y^2, y^3};
double result[16] = { ... };
我在运行此基准测试后选择了接受的答案代码:https://gist.github.com/1232406。基本上,前两个代码被运行,执行时间最短的一个获胜。
【问题讨论】:
-
你有算法太慢,还是需要算法?
-
@Als 不是作业;它的工作。
-
@Seth 我已经有一个解决方案,但是速度很慢,并且引入了外部依赖项(特别是 Eigen eigen.tuxfamily.org)来执行 Kronecker 产品。
-
如果您使用的是 Eigen,而且速度很慢,那么无论是您做错了还是做得更快,都意味着英特尔数学库的魔力。
-
我很可能使用 Eigen 做错了;我会同意的。基本上,我无法让 Eigen 在
Map<VectorXd>上执行 Kronecker 乘积而不创建Map的副本,从而执行内存分配然后复制,从而减慢执行速度。
标签: c++ algorithm optimization