Matlab 类方法:参数太多
Posted
技术标签:
【中文标题】Matlab 类方法:参数太多【英文标题】:Matlab Class Method: Too many arguments 【发布时间】:2013-05-03 00:50:26 【问题描述】:我找到了一些相关的问题,但并没有真正找到答案。
我正在编写一个简单的 MATLAB 小类,以便在 MATLAB 中学习 OOP 语法。我对 Python 非常熟悉,并且在尝试使用 MATLAB 时竭尽全力。这是定义:
classdef Car < handle
properties
speed = [0,0] %x,y velocity
position = [0,0]
running = false
end
methods
function obj = Car(pos, spd)
obj.position = pos;
obj.speed = spd;
end
function accelerate(obj,x,y) % Add to speed
obj.speed = obj.speed + [x,y]
end
function position = getPosition(obj)
position = obj.position
end
function start(obj)
obj.running = true
end
function stop(obj)
obj.running = false
end
end
end
这肯定是没有完成,但后来我用一个小脚本来搞乱对象:
foo = Car([1,1],[0,2])
foo.start
foo.accelerate(2,3)
实例化有效,但我调用的任何方法都会引发错误。 foo.start,例如:
Error using Car/start
Too many input arguments.
我错过了什么??
【问题讨论】:
我应该澄清的是,对于我尝试在对象上调用的任何方法,它总是相同的“输入参数过多”错误。 什么版本的 MATLAB?您的代码在 R2011b 上适用于我。 sh*t... 我刚刚使用了 clear 命令,现在它正在工作。我应该删除这个问题吗? 【参考方案1】:由于我不知道如何删除这个问题,我会尽力回答它。与其他语言一样,MATLAB 中的面向对象编程希望将obj
视为类方法中的第一个参数(如python 中的self
)。对对象的这种引用是修改其属性所必需的。我没有在方法定义中包含这个,所以当我调用该方法时,我得到了“参数太多”的错误。那是因为如果你做foo.method(a,b)
,那么对象foo
实际上是作为参数传递的,所以你的函数实际上得到了3个输入,即method(foo,a,b)
。
我检查了我的代码并在适当的位置添加了obj
,但未能在 MATLAB 命令窗口中使用clear
命令。由于我是 MATLAB 新手,所以我没有意识到它的重要性。我只是假设保存文件并重新实例化我的类就足够了。不是。
我希望这对遇到这个问题的人有所帮助。
【讨论】:
【参考方案2】:如果将方法声明为静态,则无需将 obj 传递给输入:
classdef class1
methods (Static)
function y=aPLUSb(a,b)
y=a+b;
end
end
end
【讨论】:
【参考方案3】:您回答了自己的问题,这很好。但是,您的问题似乎包括您一开始就努力执行的代码。我原以为你的代码一开始看起来像:
classdef Car < handle
properties
speed = [0,0] %x,y velocity
position = [0,0]
running = false
end
methods
function obj = Car(pos, spd)
obj.position = pos;
obj.speed = spd;
end
function accelerate(x,y) % Add to speed
obj.speed = obj.speed + [x,y]
end
function position = getPosition()
position = obj.position
end
function start()
obj.running = true
end
function stop()
obj.running = false
end
end
end
后来,变成了你在问题中写的内容:
classdef Car < handle
properties
speed = [0,0] %x,y velocity
position = [0,0]
running = false
end
methods
function obj = Car(obj,pos, spd)
obj.position = pos;
obj.speed = spd;
end
function accelerate(obj,x,y) % Add to speed
obj.speed = obj.speed + [x,y]
end
function position = getPosition(obj)
position = obj.position
end
function start(obj)
obj.running = true
end
function stop(obj)
obj.running = false
end
end
end
请注意,执行您问题中的代码允许我访问和执行您的类中声明的所有方法。尝试访问在第一个代码块中声明的方法会导致“参数过多”错误。尝试访问在第二个块中声明的方法可以正常工作。
【讨论】:
以上是关于Matlab 类方法:参数太多的主要内容,如果未能解决你的问题,请参考以下文章