Why does MATLAB throw a “too many output arguments” error when I overload subsref (subscripted reference)?

后端 未结 4 1891
别跟我提以往
别跟我提以往 2021-02-09 14:09

As a toy example, I have a class that simply wraps a vector or matrix in an object and includes a timestamp of when it was created. I\'m trying to overload

4条回答
  •  后悔当初
    2021-02-09 14:39

    I am working on a class to handle polynomials and polynomial matrices. I was having the same dificulty because I want different behaviors for the '.' indexing in the cases of scalar polynomials and polynomial matrices.

    In my case I want P.coef to return a vector of coefficients if P is a scalar polynomial. If P is a polynomial matrix, P.coef must return a cell array of the same size of P, in which the cell {i,j} contains the coefficient vector of the polynomial P(i,j).

    The problem appeared when P.coef was used with a matrix. My desired behavior returns only one object as an answer, but Matlab is expecting the function to return numel(P) objects.

    I found a very simple solution. When declaring subsref, I used one mandatory output and a varargout:

    function [R,varargout] = subsref(P,S) 
    

    The body of the function defines R as needed, according to my design. And at the very end of the function I added:

    varargout(1:nargout-1) = cell(1,nargout-1);
    

    To just return empty matrices as the extra outputs that Matlab wants.

    This should create no problem if the function is always called with a single output argument, e.g., as in R = P.coef. If the function is called without assigning, the user will see numel(P)-1 empty matrices, which is really not a big deal. Anyway, the user is warned about this in the function help.

提交回复
热议问题