code: def updat_direct(I, E, U, padding, strides):
      C, Y, X, N = I.shape
      K, P, Q, N = E.shape
      C, R, S, K = U.shape
  
      if all(x == 1 for x in (R, S)):
          # CxK = CxHWN . KxHWN.T
          U[:] = np.dot(
              I.reshape((C, -1)), E.reshape((K, -1)).T
          ).reshape((U.shape))
          return
  
      U.fill(0.0)
  
      qSlice = [
          fconv_slice(q, S, X, padding[0], strides[0]) for q in range(Q)
      ]
  
      for p in range(P):
          sliceR, sliceY, rlen = fconv_slice(
              p, R, Y, padding[1], strides[1]
          )
  
          for q in range(Q):
              sliceS, sliceX, slen = qSlice[q]
  
              slicedI = I[:, sliceY, sliceX, :].reshape((-1, N))
              slicedE = E[:, p, q, :]
  
              U[:, sliceR, sliceS, :] += np.dot(
                  slicedI, slicedE.T
              ).reshape((C, rlen, slen, K))
  
imports: from __future__ import division
  import numpy
  from struct import pack, unpack
  from neon import logger
label_desc: Use image node_id 8 for calling a global function with example usage: updat_direct(I, E, U, padding, strides) without return types