Since I have devised the following, they may be thought useful for that secret crock of gold at the end of the rainbow (WHERE is it??) full of people's programming tips. "%+.%"<-function(X,x){sweep(X,1,x,"+")} "%.+%"<-function(X,x){sweep(X,2,x,"+")} X %+.% x adds a vector x to each of the columns of the matrix X with x recycled down columns if length(x) != nrow(X) X %+.% x adds a vector x to each of the rows of the matrix X with x recycled along rows if length(x) != ncol(X) Although "X+x" will work down columns, and "t(t(X)+x)" will work along rows, it is handy to have a consistent (and mnemonic) notation; and, in any case, neither of these will work if x is a kx1 or 1xk matrix rather than a vector or a list c(x1,...,xk). The above will work in all cases, and also X%+.%x = X%+.%t(x), X%.+%x = X%.+%t(x). Example: > S [,1] [,2] [,3] [1,] 1.0 0.6 0.3 [2,] 0.6 1.0 0.6 [3,] 0.3 0.6 1.0 > x [1] 0 1 2 > S%+.%x [,1] [,2] [,3] [1,] 1.0 0.6 0.3 [2,] 1.6 2.0 1.6 [3,] 2.3 2.6 3.0 > S%.+%x [,1] [,2] [,3] [1,] 1.0 1.6 2.3 [2,] 0.6 2.0 2.6 [3,] 0.3 1.6 3.0 Anyway,crock of gold or not, somebody may find them useful. Best wishes to all, Ted. -------------------------------------------------------------------- E-Mail: (Ted Harding) <Ted.Harding at nessie.mcc.ac.uk> Fax-to-email: +44 (0)870 167 1972 Date: 09-Jul-03 Time: 00:49:36 ------------------------------ XFMail ------------------------------