Вы можете сделать массив такой же формы, как X, содержащий по столбцам средние значения:
means = repmat(mean(X), [size(X,1) 1]);
X(X==0) = means(X==0);
[ИЗМЕНЕНО, чтобы добавить ...]
Или, если явное расширение массива вас обидит, вы можете сделать это:
X = bsxfun(@(x,y)(x+(x==0)*y), X, mean(X));
, что немного «умно» на мой вкус, но, кажется, примерно на 25% быстрее в одном тестируемом случае (массив 1000x1000, около 10% которого составляют нули).