如何在Matlab中计算这个和?

如何在Matlab中计算这个和?,matlab,sum,Matlab,Sum,如何在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 = NU

如何在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; 

假设
s
是一个向量,
n
是一个与
s
长度相同的向量,那么

sel = s < max(s(:)); % select relevant entries 
sum( n( sel ) .* s(sel).^2 ) ./ sum( s.*n )
sel=s
在您的示例中,
n=sum(bsxfun(@eq,s,s'),1)

请注意,您可以使用点积计算
sum(x.*y)=x(:)'*y(:)


然而,当你使用这个技巧时,你需要小心向量的维数,否则你会发现自己在计算外积….

对于
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 ) )
us=unique(s);
n=历史(美国、南部);%//计数
sel=美国<最大值(美国);
行=@(x)x(:).;%/'转换为行向量
列=@(x)x(:);%//转换为列向量
结果=(第(美国)行第^2列第(n)列第^2列)/(第(美国)行第^2列)

我的两个答案的比较可以在上找到。

对不起,我在重新键入代码时出错,我编辑了。该标量类型为n。您确定
n
?如果在
s
中有一个元素出现两次,则每次将其与2相乘时,将其求和两次。n被定义为s中s(i)的数量。。。(我作为迭代索引)对不起,我又编辑了一次:n是一个标量,它是其中s(f)的计数s@misiMe我还编辑了我的答案以反映这一变化
n
不是标量,而是与
s
长度相同的向量,您对每个
s(f)
@Shai使用不同的
n
,什么是
num
?你的意思大概是说,我现在知道我的答案和这个一样了。删除它你的两个答案相等吗?@misiMe他们相等,请看我的表意文字比较。