|   | 1 |  initial version  | 
Define a function, either recursive or not, to do that.
Recursive version:
def Mk_rec(M0, k, F):
    import numbers
    if not isinstance(k, numbers.Integral) or k < 0:
        raise ValueError(f'Expected non-negative integer k, got: {k}')
    MS = M0.parent()  # the matrix space
    if k == 0:
        return MS(M0)
    M = Mk_rec(M0, k - 1, F)
    FF = lambda a: F(a, a)
    return MS(lambda i, j: FF(M[i, j]))
Non-recursive version:
def Mk_nrec(M0, k, F):
    import numbers
    if not isinstance(k, numbers.Integral) or k < 0:
        raise ValueError(f'Expected non-negative integer k, got: {k}')
    MS = M0.parent()  # the matrix space
    M = MS(M0)
    FF = lambda a: F(a, a)
    for j in range(k):
        M = MS(lambda i, j: FF(M[i, j]))
    return M
Examples:
sage: M0 = matrix([[0, 2], [1, -1]])
sage: F = lambda a, b: a + b
sage: Mk_nrec(M0, 2, F)
[ 0  8]
[ 4 -4]
sage: Mk_rec(M0, 2, F)
[ 0  8]
[ 4 -4]
 Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.
 
                
                Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.