作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在计算 Clojure 中 3d 点云的边界框。点云表示为 Java 原始浮点数组,点云中的每个点都使用 4 个浮点存储,其中最后一个浮点未使用。像这样:
[x0 y0 z0 u0 x1 y1 z1 u1 .... ]
(defn good-compute-bbox [^floats data]
(let [n (alength data)]
(loop [i (int 0)
minx (float (aget data 0))
maxx (float (aget data 0))
miny (float (aget data 1))
maxy (float (aget data 1))
minz (float (aget data 2))
maxz (float (aget data 2))]
(if (< i n)
(let [x (float (aget data (unchecked-add i 0)))
y (float (aget data (unchecked-add i 1)))
z (float (aget data (unchecked-add i 2)))]
(if (and (Float/isFinite x)
(Float/isFinite y)
(Float/isFinite z))
(recur (unchecked-add-int i (int 4))
(min minx x)
(max maxx x)
(min miny y)
(max maxy y)
(min minz z)
(max maxz z))
(recur (unchecked-add-int i (int 4))
minx
maxx
miny
maxy
minz
maxz
))
)
[minx maxx miny maxy minz maxz]))))
public class BBox {
public static float[] computeBBox(float[] data) {
long n = data.length;
float[] result = new float[6];
float minx = data[0];
float maxx = data[0];
float miny = data[1];
float maxy = data[1];
float minz = data[2];
float maxz = data[2];
for (int i = 0; i < n; i += 4) {
float x = data[i + 0];
float y = data[i + 1];
float z = data[i + 2];
if (java.lang.Float.isFinite(x) &&
java.lang.Float.isFinite(y) &&
java.lang.Float.isFinite(z)) {
minx = x < minx? x : minx;
maxx = x > maxx? x : maxx;
miny = y < miny? y : miny;
maxy = y > maxy? y : maxy;
minz = z < minz? z : minz;
maxz = z > maxz? z : maxz;
}
}
result[0] = minx;
result[1] = maxx;
result[2] = miny;
result[3] = maxy;
result[4] = minz;
result[5] = maxz;
return result;
}
};
最佳答案
这里的罪魁祸首——正如我从你的代码中看到的,你已经怀疑了——是 min
.它适用于各种类型,而且速度不是那么快。
通过使用 Apache 的 commons 快速数学,您可以得到 10% 以内的 Java:
(defn primitive-compute-bbox-new [^floats data]
(let [n (alength data)]
(loop [i (int 0)
minx (aget data 0)
maxx (aget data 0)
miny (aget data 1)
maxy (aget data 1)
minz (aget data 2)
maxz (aget data 2)]
(if (< i n)
(let [x (aget data (unchecked-add i 0))
y (aget data (unchecked-add i 1))
z (aget data (unchecked-add i 2))]
(if (and (Float/isFinite x)
(Float/isFinite y)
(Float/isFinite z))
(recur (unchecked-add-int i 4)
(FastMath/min (float minx) x)
(FastMath/max (float maxx) x)
(FastMath/min (float miny) y)
(FastMath/max (float maxy) y)
(FastMath/min (float minz) z)
(FastMath/max (float maxz) z))
(recur (unchecked-add-int i 4)
minx
maxx
miny
maxy
minz
maxz)))
[minx maxx miny maxy minz maxz]))))
[org.apache.commons/commons-math3 "3.6.1"]
关于performance - 提高 Clojure 中点云边界框计算的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49423231/
我是一名优秀的程序员,十分优秀!