cell entry-function_handler calculation

6 visualizaciones (últimos 30 días)
Hyeyun Yang
Hyeyun Yang el 24 de En. de 2017
Comentada: Stephen23 el 24 de En. de 2017
In matrix 'px' store the x-coordinate of P12, P13.(just points)
px{1} = @(x) x(1); %xp12
px{2} = @(x) x(2); %xp13
And generate the permutation of them.
ppx = perms(px);
But, When I try to calculate them like below:
fun = @(x) (ppx(1,1)-ppx(1,2))*(ppx(2,1)-ppx(2,2));
fminsearch(fun,[0,0]);
-------------- Always the error message occur:
Undefined operator '*' for input arguments of type
'cell'.
Error in
test4>@(x)pp1x(1,1)*pp1x(1,2)-pp1x(2,1)*pp1x(2,2)
Error in fminsearch (line 189)
fv(:,1) = funfcn(x,varargin{:});
Error in test4 (line 15)
fminsearch(fun,[0,0]);
Help me..

Respuestas (2)

Guillaume
Guillaume el 24 de En. de 2017
Editada: Guillaume el 24 de En. de 2017
Your first statement: "In matrix 'px' store the x-coordinate of P12, P13.(just points)" is incorrect. Your px is a cell array of anonymous functions, it does not store any coordinates.
You then use perms on that cell array, which surprisingly works despite cell arrays not being documented as an acceptable input. This results in a larger cell array of anonymous function.
You then declare another anonymous function that has many problems:
  • It has an input x that is not actually used by the function (x only appears in the @(x) not in the expression itself)
  • You're using () to index your cell array instead of {}. () returns a portion of a cell array as a cell array. If you want the content of a particular cell it's ppx{1, 1}
  • Even if you'd used {} to get the content of the cell array you'd still be subtracting/multiplying functions instead of numbers.
My guess is that you wanted to do:
fun = @(x) (ppx{1,1}(x) - ppx{1, 2}(x)) * (ppx{2, 1}(x) - ppx{2,2}(x));
possibly, maybe. A clearer version of the above would be:
fun = @(x) (x(2)-x(1)) * (x(1)-x(2))
%aka:
fun = @(x) -(x(2)-x(1))^2
which is not very useful for fminsearch.
Note that the error message shows a different fun (with swapped * and -). It does not make much more sense since the equivalent would be:
fun = @(x) x(1)*x(2) - x(2)*x(1)
%aka
fun = @(x) 0
  5 comentarios
Hyeyun Yang
Hyeyun Yang el 24 de En. de 2017
Editada: Hyeyun Yang el 24 de En. de 2017
I want to generate the permutation of the coordinates of the points:
perms1 = p13 p12
p12 p13
And the p12, p13 points are the variables:
p12x = @(x) x(1);
p13x = @(x) x(2);
p12y = @(x) x(3);
p13y = @(x) x(4);
And I want to make a function to calculate the distance between the points I set.
sx = 0.0123;
sy = 0.231;
tx = 0.0321;
ty = 0.121;
fun1 = |sp12|+|p12p13|+|p12t|
fminsearch(fun,[0,0])
fun2 = |sp13|+|p13p12|+|p13t|
fminsearch(fun,[0,0])
when I write the fun1,fun2 by directly using the "x(1)" and "x(2)", it works.
But it is exhausted when the number of points are larger. So I want to do it by for loop, also I supposed to use the permutation matrix having the "function_handler" as a entry.
Stephen23
Stephen23 el 24 de En. de 2017
p12x = @(x) x(1);
etc.
Why do these have to be function handles? What is wrong with simply generating permutations of x ?

Iniciar sesión para comentar.


Walter Roberson
Walter Roberson el 24 de En. de 2017
You are assigning using cell notation, which is necessary to store multiple function handles. But then you use () indexing, and the result of () on a cell array is a cell array (possibly a 1x1 cell array), not what is stored in the cell array. And you cannot multiply cell arrays.
If you were to use {} notation then you would get the function handles, but you would have a problem because it is not valid to subtract function handles.
You need to use something like
fun = @(x) (ppx{1,1}(x) -ppx{1,2}(x))*(ppx{2,1}(x)-ppx{2,2}(x));

Categorías

Más información sobre Operators and Elementary Operations en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by