Unrecognized function or variable 'datachk'?
    16 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Valeri Aronov
 el 18 de Ag. de 2021
  
    
    
    
    
    Comentada: Valeri Aronov
 el 20 de Ag. de 2021
            Soryy for the long Description. I have prepared a target function for optimization and am using it to build contours for now. Here is a function (a shorten version) to pass parameters to the target function:
function y = OptimizeFilter(A0, f, x0)
    A0Val = vpa(A0);
    fVal = vpa(f);	
    xC1 = linspace(0.1, 1.9);
    yR1 = linspace(0.1, 1.9);
    [XC1, YR1] = meshgrid(xC1, yR1);
    fun=@(xx,yy) Target([xx,1,yy,1]);  
    Z=arrayfun(fun, XC1, YR1,'uniformoutput',false); % 2 last params I put in w/o much understanding on MATLAB's hint
    contour(XC1, YR1, Z);
    function y = Target(x)
        y = 0;
        for i = 1:length(fVal)
           aCurrent = AmplAndDers(x0(1), x0(2), x0(3), x0(4), fVal(i), x(1), x(2), x(3), x(4)); 
           dev = aCurrent - A0Val(i);
           y = y + dev^2;
        end
    end
end
-----------------------
AmplAndDers() was generated by MATLAB out for objective function and its derivatives (1st and 2nd). It starts with (94 lines long):
function Ampl = AmplAndDers(C1_0,C2_0,R1_0,R2_0,w,x1,x2,x3,x4)
        t2 = C1_0.^2;
        t3 = C2_0.^2;
        t4 = R1_0.^2;
        t5 = R2_0.^2;
        t6 = w.^2;
        t8 = x1.^2;
        t9 = x2.^2;
        t10 = x3.^2;
        t11 = x4.^2;
        t12 = C2_0.*R1_0.*x3;
...
It behaves reasonably  if I call from Command Window:
        OptimizeFilter([1.12511646	3.8376244], [2089.296131    7585.77575], [0.1e-6 1.5e-9 16000 11000]);
but not when I call:
        OptimizeFilter(A_Init, f, [0.1e-6 1.5e-9 16000 11000]);
Instead of prompt response in first case, it took 11 mins before it failed:
       Unrecognized function or variable 'datachk'.
        Error in contour (line 46)
            [pvpairs, ~, ~, errmsg, warnmsg] = matlab.graphics.chart.internal.contourobjHelper('parseargs', false,
            args{:});
        Error in OptimizeFilter (line 28)
            contour(XC1, YR1, Z);
I have a suspicion that the problem might be some remnants of symbolic business persisting in AmplAndDers() because terminating the run I would see some references to symbolic scope like:
        In  ./  (line 366)
                X = privBinaryOp(A, B, 'symobj::zipWithImplicitExpansion', 'symobj::divide');
        In AmplAndDers (line 53)
                Ampl = 1.0./sqrt(t46);
        In OptimizeFilter/Target (line 58)
                aCurrent = AmplAndDers(x0(1), x0(2), x0(3), x0(4), fVal(i), x(1), x(2), x(3), x(4));
        In OptimizeFilter>@(xx,yy)Target([xx,1,yy,1]) (line 21)
                fun=@(xx,yy) Target([xx,1,yy,1]);
        In OptimizeFilter (line 24)
                Z=arrayfun(fun, XC1, YR1,'uniformoutput',false);
Admittedly C1_0, C2_0, ... and x are syms in Workspace, but I do pass numeric values to AmplAndDers(). Is that a problem?
3 comentarios
  Adam Danz
    
      
 el 19 de Ag. de 2021
				I see.  Walter Roberson addressed this below.  Matlab's error message is certainly not helpful in understanding that the inputs are unexpected.  
Respuesta aceptada
  Walter Roberson
      
      
 el 19 de Ag. de 2021
            Z=arrayfun(fun, XC1, YR1,'uniformoutput',false); % 2 last params I put in w/o much understanding on MATLAB's hint
You use 'uniformoutput', false, which tells arrayfun that the output is a cell array.
    ZClass = 'cell'
and that confirms it.
   contour(XC1, YR1, Z);
so you are passing a cell array as the third parameter to contour(). However,
there are no syntaxes for contour() that permit you to pass a cell array as the third parameter.
If I read the code correctly it looks to me as if each of the outputs from the function would be a scalar, so I would expect it to work if you set 'uniformoutput', true
10 comentarios
  Walter Roberson
      
      
 el 20 de Ag. de 2021
				Yes, you should start a different Question about the slow arrayfun() . When you do, you should post all your current code. 
The profile information you showed cannot be explained based upon the code you claim to be executing in this current Question, and every time I press you on that, you say that the parts I am noticing are no longer part of your code, so you need to present clean information to fresh eyes.
It will have to be a different volunteer that looks through it, though, as I am caught up on internal evidence that your code is not what you claim it to be, and you no longer trust my analysis.
Más respuestas (0)
Ver también
Categorías
				Más información sobre Number Theory en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



