sum of function handle

2 次查看(过去 30 天)
Heborvi
Heborvi 2015-12-15
评论: Matt J 2015-12-15
Dear all, i have the following function:
sum_{1<=i<j<=n}(X_i-X_j)
and i need to write it as function handle. Can anyone help me please. Best regards.
  4 个评论
Guillaume
Guillaume 2015-12-15
Your function does not appear to be the same thing at all as the expression you wrote in your question. Why is there a third iterator k, why is there a square ^2 and later a square root sqrt ?
Heborvi
Heborvi 2015-12-15
编辑:Heborvi 2015-12-15
X is a matrix (n x q), each X_i is a vector in R^q. My function is the following:
sum_{1<=i<j<=n} abs( (sqrt(sum_{k=1}^{q} (X(i,k)-X(j,k))^2)-D(i,j)) )
In the first question, i have introduced a simple problem to show how the summation of function handle works.

请先登录,再进行评论。

回答(3 个)

Guillaume
Guillaume 2015-12-15
"I need to write it as function handle". Why do you need it? As Adam says, work it out as a normal function.
Anyway:
sumdiff = @(x) sum(diff(x(nchoosek(1:numel(x), 2)), [], 2)); %assume x is a vector
The way this works:
  • nchoosek returns all the possible combinations of i and j that satisfy 1<=i<j<=n
  • these combinations are use to index the original array as two columns, x(i) in the first column, x(j) in the second
  • diff calculates the difference between the 2nd and 1st column
  • sum sum all the differences
  4 个评论
Heborvi
Heborvi 2015-12-15
编辑:Heborvi 2015-12-15
If X is a matrix, this function works? it is possible to include a loop in an handle function? (my algorithm take the fuction as handle function )
Adam
Adam 2015-12-15
编辑:Adam 2015-12-15
You can include anything you like in a handle function if it isn't an anonymous function.
You literally just define your function and then use function handle syntax to create a handle to it. The function could be 5000 lines long if you really want (obviously not advisable!), e.g.
function s = sumdiff(x)
...
end
f = @(x) sumdiff(x)
s = f(x);

请先登录,再进行评论。


Matt J
Matt J 2015-12-15
f=@(X) sum( reshape( triu( bsxfun(@minus, X(:),X(:).'),1), [],1) )

Matt J
Matt J 2015-12-15
g=@(X) (length(X):-1:1)*X(:) - sum(cumsum(flip(X)))
  3 个评论
Matt J
Matt J 2015-12-15
if X is a matrix, flip(X) works?
I've been assuming -- as your original post assumes -- that X is a vector.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Data Type Identification 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by