matlab不能在对象上使用点运算符

时间:2016-02-04 06:56:13

标签: matlab parsing

今天我在MATLAB中练习使用类时遇到了一个奇怪的问题。似乎MATLAB无法解析对象周围的括号。

我创建了一个名为vector的用户定义类,它具有各种属性:x和y方向的幅度,角度,长度。我重载了一元减号运算符,以便我可以

a = vector(5,50) % creates a vector with magnitude 5 and angle 50 (in degrees)
a.ang % prints the angle
b = -a
b.ang % 230 degrees

这一切都很好,但是我想要在一行中找到-a的角度。你期待像

这样的东西
(-a).ang

工作,但我得到了

 (-a).ang
     |
 Error: Unexpected MATLAB operator.

我无法使用

 -a.ang

因为点运算符的优先级高于减号。是什么解释为什么matlab不能解析对象周围的括号?

编辑:这是我创建的矢量类。

classdef vector
    properties
        mag
        ang % in degrees
        x
        y
    end

    methods
        function v = vector(mag,ang)
            if nargin == 2
                v.mag = mag;
                v.ang = ang;
                v.x = mag*cosd(ang);
                v.y = mag*sind(ang);
            end
        end
        function res = plus(u,v)
            x = u.x + v.x;
            y = u.y + v.y;
            res = vector(norm([x,y]), atan2d(y,x));
        end
        function res = minus(u,v)
            x = u.x - v.x;
            y = u.y - v.y;
            res = vector(norm([x,y]), atan2d(y,x));
        end
        function res = uminus(v)
            res = vector;
            res.x = -v.x;
            res.y = -v.y;
            res.mag = v.mag;
            res.ang = mod(v.ang+180,360);
        end

    end
end

2 个答案:

答案 0 :(得分:2)

我想我找到了答案。通常,Matlab不支持链接在一起的两组括号,因为它可以是索引或函数调用。

  

MATLAB的解析器有限,部分原因是历史原因。它永远不会   由于含糊不清,有可能做f(4)(1)之类的事情。这是否意味着f(4)是一个函数句柄然后我们想要将1传递给该函数或者它是否意味着f是一个函数,我们将4传递给该函数,它返回一个向量然后我们索引到第一个那个元素?好吧,解析器也不知道。它可以定义,但直到现在还没有。

来源:https://www.mathworks.com/matlabcentral/newsreader/view_thread/280225

此外,一旦我意识到两个并排的括号是问题,似乎主要的解决方法是:

  1. 使用SUBSREF函数显式评估括号
  2. 定义您自己的匿名函数,为您执行索引和数组处理。
  3. 这些解决方法在以下链接的前两个答案中进行了解释。

    How can I index a MATLAB array returned by a function without first assigning it to a local variable?

    感谢您查看我的问题!

答案 1 :(得分:1)

我无法复制矢量函数,但是对于像这样的简单结构

a.ang=[2,4,6,8]

你需要的是

-a.ang

而不是

(-a).ang

将重现您提到的错误