Using sparse matrices when value depends on position
func1[a_, b_] := a + b;
func2[a_, b_] := 1 + a + b;
func3[a_, b_] := a + 2 b;
n = 10;
sa = SparseArray[{Band[{1, 1}] -> (func1[0, #] & /@ Range[n]),
Band[{1, 2}] -> (func2[0, #] & /@ Range[n - 1]),
Band[{2, 1}] -> (func3[0, #] & /@ Range[n - 1])}, {n, n}];
sa // MatrixForm
or
sa = Quiet@SparseArray[{Band[{1, 1}] -> (func1[0, #] & /@ Range[n]),
Band[{1, 2}] -> (func2[0, #] & /@ Range[n]),
Band[{2, 1}] -> (func3[0, #] & /@ Range[n])}, {n, n}];
sa // MatrixForm
(* same result *)