如何以紧凑的方式在Matlab中计算这个总和? (n是与每个s相关的值)
我做了:
NUM = 0;
DEN = 0;
max_s = max(s);
for f = 1 : length(s)
n = sum(s == s(f));
if (s(f) ~= max_s)
NUM = NUM + s(f) * s(f) * n;
end
DEN = DEN + s(f) * n;
end
result = NUM / DEN;
答案 0 :(得分:3)
假设s
是一个向量,n
是一个与s
长度相同的向量,那么总和
sel = s < max(s(:)); % select relevant entries
sum( n( sel ) .* s(sel).^2 ) ./ sum( s.*n )
您的示例n=sum( bsxfun( @eq, s, s' ), 1 )
中的。
请注意,您可以使用点积来cumpute sum( x .* y ) = x(:)' * y(:)
但是,当你使用这个技巧时,你需要小心矢量的维度,否则你会发现自己计算外部产品......
答案 1 :(得分:0)
对于n
的具体定义,您可以使用hist
和unique
us = unique( s );
n = hist( s, us ); %// count
sel = us < max(us);
row = @(x) x(:).'; %//' convert to row vector
col = @(x) x(:); %// convert to col vector
result = ( row( us(sel).^2 ) * col( n(sel).^2 ) ) / ( row( us ) * col( n.^2 ) )
我的两个答案的比较可以在ideone找到。