我是 OpenVX 的新手,从文档中了解到 OpenVX 使用row-major storage。下面的矩阵访问示例说明了这一点,就像我们在纯 C 代码中使用的普通行优先访问模式一样。
然后我转到vx_matrix和vxCreateMatrix文档页面。前者有这样的说法:
VX_MATRIX_ROWS - 矩阵的 M 维 [REQ-1131]。只读 [REQ-1132]。使用 vx_size 参数。
VX_MATRIX_COLUMNS - 矩阵的 N 维 [REQ-1133]。只读 [REQ-1134]。使用 vx_size 参数。
而后者说:
vx_matrix vxCreateMatrix(
vx_context c,
vx_enum data_type,
vx_size columns,
vx_size rows);
所以根据我的理解,在 OpenVX 世界中,当我说 MxN 矩阵时,M 指的是行大小,N 指的是列大小。并且vxCreateMatrix
声明只是遵循行主要存储所说的,column
首先是参数,然后是row
。
但是,当我到达Warp Affine页面时,它真的让我很困惑,它说:
该内核使用这种像素坐标转换方法 [REQ-0498] 执行具有 2x3 矩阵 M 的仿射变换:
和 C 声明:
// x0 = a x + b y + c;
// y0 = d x + e y + f;
vx_float32 mat[3][2] = {
{a, d}, // 'x' coefficients
{b, e}, // 'y' coefficients
{c, f}, // 'offsets'
};
vx_matrix matrix = vxCreateMatrix(context, VX_TYPE_FLOAT32, 2, 3);
vxCopyMatrix(matrix, mat, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
如果 M 是 2x3 矩阵,根据上一节,它应该有 2 行和 3 列。那么为什么要声明为mat[3][2]
并createMatrix
接受column=2
和row=3
作为论点呢?我的理解完全错误吗?