Source code for svcco.implicit.core.m_matrix

import numpy as np
import numba as nb
from .utils import norm

[docs]@nb.jit(nopython=True) def M(surface): N = surface.shape[0] D = surface.shape[1] M_matrix = np.zeros((N*4,N*4)) for i in range(N): for j in range(i,N): M_matrix[i,j] = norm(surface[i,:] - surface[j,:])**3 M_matrix[j,i] = norm(surface[i,:] - surface[j,:])**3 for i in range(N): for j in range(N): for k in range(D): M_matrix[i,N+j+k*N] = 3*norm(surface[i,:] - surface[j,:])*\ (surface[i,k] - surface[j,k]) M_matrix[N+j+k*N,i] = 3*norm(surface[i,:] - surface[j,:])*\ (surface[i,k] - surface[j,k]) for i in range(N): for j in range(i,N): diff = surface[i,:] - surface[j,:] for k in range(D): for l in range(D): if i==j: M_matrix[N+j+l*N,N+i+k*N] = 0 M_matrix[N+i+k*N,N+j+l*N] = 0 elif k==l: M_matrix[N+j+l*N,N+i+k*N] = -(3*(diff[l])**2/norm(surface[i,:] - surface[j,:]) +\ 3*norm(surface[i,:] - surface[j,:])) M_matrix[N+i+k*N,N+j+l*N] = -(3*(diff[l])**2/norm(surface[i,:] - surface[j,:]) +\ 3*norm(surface[i,:] - surface[j,:])) else: M_matrix[N+j+l*N,N+i+k*N] = -3*diff[k]*diff[l]/norm(surface[i,:] - surface[j,:]) M_matrix[N+i+k*N,N+j+l*N] = -3*diff[k]*diff[l]/norm(surface[i,:] - surface[j,:]) return M_matrix