Код Matlab bsxfun () - PullRequest
       39

Код Matlab bsxfun ()

3 голосов
/ 21 марта 2011

Что это делает?

u = [5 6];
s = [1 1];
data1    =[randn(10,1) -1*ones(10,1)];
data2    =[randn(10,1) ones(10,1)];
data     = [data1; data2];
deviance = bsxfun(@minus,data,u);  
deviance = bsxfun(@rdivide,deviance,s); 
deviance = deviance .^ 2; 
deviance = bsxfun(@plus,deviance,2*log(abs(s)));
[dummy,mini] = min(deviance,[],2);

Есть ли эквивалентный способ сделать это без bsxfun?

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Функция BSXFUN будет выполнять запрошенную поэлементную операцию (аргумент дескриптора функции) путем репликации измерений двух входных аргументов, чтобы они соответствовали друг другу по размеру.В этом случае вы можете избежать использования BSXFUN , реплицируя переменные u и s самостоятельно, используя функцию REPMAT , чтобы каждый из них имел размер, равный data.Тогда вы можете использовать стандартные поэлементные арифметические операторы :

u = repmat(u,size(data,1),1);  %# Replicate u so it becomes a 20-by-2 array
s = repmat(s,size(data,1),1);  %# Replicate s so it becomes a 20-by-2 array
deviance = ((data-u)./s).^2 + 2.*log(abs(s));  %# Shortened to one line
2 голосов
/ 21 марта 2011

bsxfun выполняет двоичные операции поэлементно.Это полезно, когда вам нужно вычесть вектор (в данном случае u) из всех элементов вдоль определенного измерения в матрице (в данном случае data).Измерение, по которому выполняется операция, должно совпадать в обоих случаях.Например, вы можете включить код без bsxfun как

u1=repmat(u,size(data,2),1);
deviance=data-u1;

и т. Д. Для других операций.

...