J, 9 bytes - 3 = 6
#~@|.*/#~ Inspired by @NBZ's APL answer@NBZ's APL answer, golfed down by @randomra. This defines a verb that takes in an array of numbers. It's used as follows:
(#~@|.*/#~) 4 3 12 12 12 12 9 9 9 12 12 12 12 9 9 9 12 12 12 12 9 9 9 16 16 16 16 12 12 12 16 16 16 16 12 12 12 16 16 16 16 12 12 12 16 16 16 16 12 12 12 I also claim the 3-byte bonus, since an input of 0 produces sub-matrices of size zero:
(#~@|.*/#~) 4 0 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 (#~@|.*/#~) 0 3 9 9 9 9 9 9 9 9 9 Explanation
J has a definite edge in this challenge. In addition to eating array manipulation problems for breakfast, it prints 2D matrices in the correct format by default.
#~ Replicate each number n in input n times #~@|. The same for reversed input */ Compute their multiplication table