Skip to content

Instantly share code, notes, and snippets.

@nsolnit
Last active June 15, 2023 10:05
Show Gist options
  • Save nsolnit/edec966c166a9e0460ad4446a2b45de5 to your computer and use it in GitHub Desktop.
Save nsolnit/edec966c166a9e0460ad4446a2b45de5 to your computer and use it in GitHub Desktop.
Named EXCEL lambdas for one and two dimensional linear interpolation
/**Basic 1D linear generator from 2 pts*/
LEXT = LAMBDA(X,XS,YS,
LET(X_1,INDEX(XS,1),
X_2, INDEX(XS,2),
Y_1, INDEX(YS,1),
Y_2, INDEX(YS,2),
Y_1+(X-X_1)*(Y_2-Y_1)/(X_2-X_1)
)
);
/**1D linear interpolation, set SORTED=0 for unsorted data - presorting data recommended*/
INTERP1 = LAMBDA(X,XARRAY,YARRAY,[SORTED],
IF(OR(ISOMITTED(SORTED),SORTED=1,SORTED=0),
LET(
SORT_METHOD, IF(OR(ISOMITTED(SORTED),SORTED=1),2,1),
X_1, XLOOKUP(X,XARRAY,XARRAY,,-1,SORT_METHOD),
X_2, XLOOKUP(X,XARRAY,XARRAY,,1,SORT_METHOD),
Y_1, XLOOKUP(X,XARRAY,YARRAY,,-1,SORT_METHOD),
Y_2, XLOOKUP(X,XARRAY,YARRAY,,1,SORT_METHOD),
IF(X=X_1,Y_1,Y_1+(X-X_1)*(Y_2-Y_1)/(X_2-X_1))
))
);
/**2D linear interpolation, set SORTED=0 for unsorted data - presorting data recommended*/
INTERP2 = LAMBDA(X,Y,XARRAY,YARRAY,ZARRAY,[SORTED],
IF(OR(ISOMITTED(SORTED),SORTED=1,SORTED=0),
LET(
SORT_METHOD, IF(OR(ISOMITTED(SORTED),SORTED=1),2,1),
X_1, XLOOKUP(X,XARRAY,XARRAY,,-1,SORT_METHOD),
X_2, XLOOKUP(X,XARRAY,XARRAY,,1,SORT_METHOD),
Y_1, XLOOKUP(Y,YARRAY,YARRAY,,-1,SORT_METHOD),
Y_2, XLOOKUP(Y,YARRAY,YARRAY,,1,SORT_METHOD),
Z_11, XLOOKUP(X_1,XARRAY,XLOOKUP(Y_1,YARRAY,ZARRAY,,0,SORT_METHOD),,0,SORT_METHOD),
Z_12, XLOOKUP(X_1,XARRAY,XLOOKUP(Y_2,YARRAY,ZARRAY,,0,SORT_METHOD),,0,SORT_METHOD),
Z_21, XLOOKUP(X_2,XARRAY,XLOOKUP(Y_1,YARRAY,ZARRAY,,0,SORT_METHOD),,0,SORT_METHOD),
Z_22, XLOOKUP(X_2,XARRAY,XLOOKUP(Y_2,YARRAY,ZARRAY,,0,SORT_METHOD),,0,SORT_METHOD),
Z_1, IF(Y=Y_1,Z_12,Z_11+(Y-Y_1)*(Z_12-Z_11)/(Y_2-Y_1)),
Z_2, IF(Y=Y_1,Z_21,Z_21+(Y-Y_1)*(Z_22-Z_21)/(Y_2-Y_1)),
IF(X=X_1,Z_1,Z_1+(X-X_1)*(Z_2-Z_1)/(X_2-X_1))
))
);
/** 2D wrapper for XLOOKUP - Maintains access to most of xlookup's optional inputs*/
XXXLOOKUP = LAMBDA(xi,yi,xs,ys,zs,[match_mode_x],[match_mode_y],[search_mode],
LET(
step1, XLOOKUP(xi,xs,zs,,match_mode_x,search_mode),
XLOOKUP(yi,ys,step1,,match_mode_y,search_mode)
)
);
@nsolnit
Copy link
Author

nsolnit commented Jan 19, 2023

Revised for new docstring format and improved documentation.

@nsolnit
Copy link
Author

nsolnit commented Apr 10, 2023

Depreciated... Functions now included in general toolbox

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment