MATLABでは計算をベクトル化するために、しばしば repmat で行列を拡大します。
しかし、非常に大きなデータに対してrepmat を使う場合、
その度にメモリアロケーションが行われ速度も落ちます。

そこで、repmatを使わずに計算するMEX関数を作りCVSにアップしました。
たいていの場合は、これで代用できると思います。
詳しくはヘルプと以下の例を見てください。

余分なメモリアロケーションをしないので
大容量データを扱う時に有効で、計算スピードも倍以上速いです。

■使用例
% ベクトルの正規化
x  = rand(M,N);
na = sqrt(sum(x.^2,2)); % norm
xa = vb_repmultiply(x, 1./na); % = x./repmat(na,[1 N])

nb = sqrt(sum(x.^2,1)); % norm
xb = vb_repmultiply(x, 1./nb); % = x./repmat(nb,[M 1])

% バイアス除去
ma = mean(x,2);
xa = vb_repadd(x, -ma); % = x - repmat(ma,[1 N])

mb = mean(x,1);
xb = vb_repadd(x, -mb); % = x - repmat(mb,[M 1])

% 対角行列との行列積
y  = rand(M,1);
xy = vb_repmultiply(x,y); % = diag(y) * x = repmat(y,[1 M]) .* x

z  = rand(1,N);
xy = vb_repmultiply(x,z); % = x * diag(z) = repmat(z,[N 1]) .* x

% --- Usage
% z = vb_repmultiply(x,y)
% x : M x N
% z : M x N
%
% case  y : 1 x N
%  z = x .* repmat(y, [M 1])
%    = x * diag(y)
%  z(m,n) = x(m,n) * y(n)
%
% case  y : M x 1
%  z = x .* repmat(y, [1 N])
%    = diag(y) * x
%  z(m,n) = x(m,n) * y(m)
%
% case  y : 1 x 1
%  z = x * y
%  z(m,n) = x(m,n) * y

y の次元が上のどの場合にも対応しない時はエラーになる
