我有一个存储矩阵的数组obj
,每个矩阵都需要乘以一个矩阵projection_vec
。当程序遍历所有元素obj
并将每个元素乘以projection_vec
,然后乘法的结果就是我需要的,但是当程序一次将整个数组乘以 时obj
,projection_vec
结果略有不同,我不知道如何解决它,因为一次乘以整个数组obj
比分别迭代和乘以数组的每个元素要快,请告诉我我需要在第二个代码片段中更改什么,以便结果与第一个相同片段,但代码以与第二个片段相同的速度(甚至更快)运行。
片段 1
import numpy as np
from math import *
def matrix_multiply(inp_tri, matrix):
out_tri = inp_tri @ matrix[:3, :3] + matrix[3, :3]
w = inp_tri @ matrix[:3, 3] + matrix[3, 3]
w[w == 0] = 1.0
out_tri = out_tri / w[:, None]
return out_tri
perspective_matrix = np.array([
[(1.0 / tan(45 / 180 * pi)), 0.0, 0.0, 0.0],
[0.0, (WIDTH / HEIGHT) * (1.0 / tan(45 / 180 * pi)), 0.0, 0.0],
[0.0, 0.0, 1.0, 1.0],
[0.0, 0.0, -1.0, 0.0]
])
def get_projection(translated_vec):
projection_vec = matrix_multiply(translated_vec, perspective_matrix)
projection_vec += 1.0
projection_vec = projection_vec * H_SIZE
return projection_vec
obj = np.array([[
[0, 0, 0],
[1, 1, 1],
[-2, -2, 2]
],
[
[1, 1, 1],
[0, 1, 2],
[-2, -2, -2]
]])
drawig_obj = []
for i, translated_vec in enumerate(obj):
translated_vec = get_projection(translated_vec)
drawing_obj.append(translated_vec)
print(drawing_obj)
输出:
[(array([[ nan, nan, -inf],
[ 1.28000000e+03, 1.00000000e+03, 1.00000000e+00],
[-1.42108547e-13, -2.80000000e+02, 1.50000000e+00]]), (255, 255, 255)), (array([[1.28e+03, 1.00e+03, 1.00e+00],
[6.40e+02, 6.80e+02, 1.50e+00],
[1.28e+03, 1.00e+03, 2.50e+00]]), (255, 255, 255))]
片段 2
import numpy as np
from math import *
def matrix_multiply(inp_tri, matrix):
out_tri = inp_tri @ matrix[:3, :3] + matrix[3, :3]
w = inp_tri @ matrix[:3, 3] + matrix[3, 3]
w[w == 0] = 1.0
out_tri = out_tri / w[:, None]
return out_tri
perspective_matrix = np.array([
[(1.0 / tan(45 / 180 * pi)), 0.0, 0.0, 0.0],
[0.0, (WIDTH / HEIGHT) * (1.0 / tan(45 / 180 * pi)), 0.0, 0.0],
[0.0, 0.0, 1.0, 1.0],
[0.0, 0.0, -1.0, 0.0]
])
def get_projection(translated_vec):
projection_vec = matrix_multiply(translated_vec, perspective_matrix)
projection_vec += 1.0
projection_vec = projection_vec * H_SIZE
return projection_vec
obj = np.array([[
[0, 0, 0],
[1, 1, 1],
[-2, -2, 2]
],
[
[1, 1, 1],
[0, 1, 2],
[-2, -2, -2]
]])
projection_vecs = get_projection(obj)
print(projection_vecs)
输出:
[(array([[ 6.40e+02, 3.60e+02, 5.00e-01],
[ 1.28e+03, 1.00e+03, 1.00e+00],
[-6.40e+02, -9.20e+02, 1.50e+00]]), (255, 255, 255)), (array([[ 1.28e+03, 6.80e+02, 1.00e+00],
[ 6.40e+02, 6.80e+02, 5.00e-01],
[-6.40e+02, -2.80e+02, 2.50e+00]]), (255, 255, 255))]
在那个答案中,我建议您进行调试。提供额外的输出,看看你的程序会发生什么。他甚至首先展示了在哪个功能中值得寻找答案。相反,您再次跑到论坛,以便有人为您完成工作。
我猜问题出在你的运营商身上。
在一种情况下
w
,这是一个一维数组,第一个坐标贯穿它的值,在第二种情况下,它是一个二维数组,你要除以什么 - 你只能猜测。我不知道哪个选项是正确的,根据算法应该分为什么,但形式上,简单地将调用从一种算法更改为另一种是不会成功的。