块和逆矩阵-仅做一次整形的方法

时间:2019-04-13 11:53:08

标签: python-2.7 numpy reshape matrix-inverse

我正在使用CUDA批量执行大量3x3矩阵。

目标是得到一个3x3矩阵的大矩阵(所以我使用4D数组)。

我以前使用numpy.linalg.inv函数完成了相同的操作。这样,我可以直接得到一个3x3矩阵数组:我向您展示执行此操作的代码。

现在,在CUDA版本中,我想以最少的指令重塑所生成的大1D数组:因此,我必须从(N * N * 3 *)构建一个(N,N,3,3)数组3)一维阵列。

目前,我可以将其重塑为2个步骤(此处为下面的代码)。

带有经典numpy.linalg.inv的原始版本由:

实施。
for r_p in range(N):
  for s_p in range(N):
    # original version (without GPU)
    invCrossMatrix[:,:,r_p,s_p] = np.linalg.inv(arrayFullCross_vec[:,:,r_p,s_p])

invCrossMatrix表示一个(3,3,N,N)数组,我直接从(3,3,N,N)arrayFullCross数组(dimBlocks = 3)中得到它< / p>

目前,当我使用GPU批处理执行时,我从1D数组开始:

    # Declaration of inverse cross matrix
    invCrossMatrix_temp = np.zeros((N**2,3,3))

    # Create arrayFullCross_vec array
    arrayFullCross_vec = np.zeros((3,3,N,N))

    # Create arrayFullCross_vec array
    invCrossMatrix_gpu = np.zeros((3*3*(N**2)))

    # Build observables covariance matrix
    arrayFullCross_vec = buildObsCovarianceMatrix3_vec(k_ref, mu_ref, ir)

    ## Performing batch inversion 3x3 :
    invCrossMatrix_gpu = gpuinv3x3(arrayFullCross_vec.flatten('F'),N**2)

    ## First reshape
    invCrossMatrix_temp = invCrossMatrix_gpu.reshape(N**2,3,3)
    # Second reshape : don't forget ".T" transpose operator
    invCrossMatrix = (invCrossMatrix_temp.reshape(N,N,3,3)).T

问题1):为什么必须将-F中的flatten('F')选项设置为?

如果我只做gpuinv3x3(arrayFullCross_vec.flatten,N**2),则代码不起作用:Python可能像Fortran一样是专栏的?

问题2) 现在,我想转换以下块:

## First reshape
invCrossMatrix_temp = invCrossMatrix_gpu.reshape(N**2,3,3)
# Second reshape : don't forget ".T" transpose operator
invCrossMatrix = (invCrossMatrix_temp.reshape(N,N,3,3)).T

转换为单个重塑指令:可以吗?

问题是要将一维数组invCrossMatrix_gpu(N ** 2 * 3 * 3)直接转换为(3,3,N,N)数组。

由于我多次调用这些例程,我希望仅一次重塑原始一维数组。

更新1:正确地说是由

定义的数组inVCrossMatrix
invCrossMatrix = (invCrossMatrix_temp.reshape(N,N,3,3)).T

具有尺寸(3,3,N,N)。

@hpaulj:等同于do:

 invCrossMatrix =(invCrossMatrix_temp.reshape(N,N,3,3)).transpose(2,3,0,1) 

??问候

0 个答案:

没有答案