In [1]:
import numpy as np
import malis as m
import h5py
np.set_printoptions(precision=4)
In [127]:
def mknhood2d(radius=1):
# Makes nhood structures for some most used dense graphs.
ceilrad = np.ceil(radius)
x = np.arange(-ceilrad,ceilrad+1,1)
y = np.arange(-ceilrad,ceilrad+1,1)
[i,j] = np.meshgrid(y,x)
idxkeep = (i**2+j**2)<=radius**2
i=i[idxkeep].ravel(); j=j[idxkeep].ravel();
zeroIdx = np.ceil(len(i)/2).astype(int);
# flipud and order (j,i,k) so that mknhood2(1) matches mknhood(6)
nhood = np.vstack((i[:zeroIdx],j[:zeroIdx])).T.astype(np.int32)
return np.ascontiguousarray(nhood)
def mknhood3d(radius=1):
# Makes nhood structures for some most used dense graphs.
# The neighborhood reference for the dense graph representation we use
# nhood(1,:) is a 3 vector that describe the node that conn(:,:,:,1) connects to
# so to use it: conn(23,12,42,3) is the edge between node [23 12 42] and [23 12 42]+nhood(3,:)
# See? It's simple! nhood is just the offset vector that the edge corresponds to.
ceilrad = np.ceil(radius)
x = np.arange(-ceilrad,ceilrad+1,1)
y = np.arange(-ceilrad,ceilrad+1,1)
z = np.arange(-ceilrad,ceilrad+1,1)
[i,j,k] = np.meshgrid(z,y,z)
idxkeep = (i**2+j**2+k**2)<=radius**2
i=i[idxkeep].ravel(); j=j[idxkeep].ravel(); k=k[idxkeep].ravel();
zeroIdx = np.ceil(len(i)/2).astype(int);
# flipud and order (j,i,k) so that mknhood2(1) matches mknhood(6)
nhood = np.vstack((k[:zeroIdx],i[:zeroIdx],j[:zeroIdx])).T.astype(np.int32)
return np.ascontiguousarray(nhood)
def mknhood3d_aniso(radiusxy=1,radiusxy_zminus1=1.8):
# Makes nhood structures for some most used dense graphs.
nhoodxyz = mknhood3d(radiusxy)
nhoodxy_zminus1 = mknhood2d(radiusxy_zminus1)
nhood = np.zeros((nhoodxyz.shape[0]+2*nhoodxy_zminus1.shape[0],3),dtype=np.int)
nhood[:3,:3] = nhoodxyz
nhood[3:,0] = -1
nhood[3:,1:] = np.vstack((nhoodxy_zminus1,-nhoodxy_zminus1))
return np.ascontiguousarray(nhood)
In [128]:
nh=mknhood3d()
print nh
In [129]:
nh=mknhood3d_aniso()
print nh
In [ ]: