gpt4 book ai didi

matlab - 无法使用 ; 获取函数输入

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:59 24 4
gpt4 key购买 nike

我定义了下面的类

classdef TimerManager < handle

methods (Access = private)
function obj = TimerManager()
end
end

methods (Static)
function singleObj = getInstance(varargin)
varargin{1}
singleObj = TimerManager();
end
end

methods
function foo(obj)
end

end

end

我发现以下代码 w/或 w/o 的工作方式不同;这是预期的吗?还是我错过了什么?

>> TimerManager.getInstance(0).foo()

ans =

0

>> TimerManager.getInstance(0).foo();
Index exceeds matrix dimensions.

Error in TimerManager.getInstance (line 13)
varargin{1}

如果我在 getInstance 端使用 nargin,则它是 0 ;在最后。

最佳答案

您的错误与分号无关。这与 MATLAB 处理对象的下标引用 (subsref) 的方式有关。

(详细)问题

在 MATLAB 中,您不能“链接”下标引用。例如,如果我们创建一个元胞数组,我们不能立即索引到这个元胞数组而不先将它分配给一个临时变量:

X1 = {'X1', 'X2', 'X3'}{1}

Error: Unbalanced or unexpected parenthesis or bracket.

这同样适用于访问由函数返回的对象的属性或方法。在您的情况下,TimerManager.getInstance 返回一个实例,您必须先将其分配给一个临时变量,然后才能访问它的 foo 方法。

instance = TimerManager.getInstance(0);
fooResult = instance.foo();

当 MATLAB 认为您试图将这些下标引用“链接”在一起时,它会尝试抛出错误或警告,但如果存在下标操作顺序有效的情况,则它无法抛出适当的错误。您正在经历其中一种情况。

您使用的语法类似于以下内容:

a.b(c).d()

如果 a.b 是一个 structs 的数组,d 的字段是一个函数句柄,则这是有效的。在这种情况下,c 是一个索引

当 MATLAB 解析它时,它将检索 a.b 的值,然后确保 c 是一个正整数(有效索引)并且在数组 a.b。一旦确认,MATLAB 将访问 d 字段并调用它。

如果我们回到您的代码一秒钟,我们可以注释掉 varargin{1} 行并获得更有用的错误消息。

TimerManager.getInstance(0).foo();

Subscript indices must either be real positive integers or logicals.

好吧,这是有道理的,MATLAB 将 TimerManager.getInstance 视为一个 struct 数组,并尝试使用 0 对其进行索引> 这显然是无效的并导致错误。

关于您报告的实际错误,注意上面我说过在对假设的struct 数组应用下标引用之前,MATLAB 需要首先获取当前的TimerManager.getInstance 的值。因为 MATLAB 认为这只是一个 struct 数组,所以它不会将任何输入参数传递给它,这会导致 varargin 为空以及您看到的错误.

所以你的声明在功能上与:

instance = TimerManager.getInstance;        % No input arguments
instance(0).foo() % Indexing error

请注意,如果 getInstance 的“输入”是 1,这起作用,因为这是 1 的有效索引x 1 TimerManager 实例数组,当您在没有输入的情况下调用 Timermanager.getInstance 时返回。

TimerManager.getInstance(1).foo();

可能的解决方案

使用临时变量

instance = TimerManager.getInstance(0);
fooResult = instance.foo();

或者使用method(obj) 表示法来调用方法,而不是obj.method() 表示法。

foo(TimerManager.getInstance(0))

关于 Octave 的注释

这一切在 Octave 中都不会成为问题,因为它允许将这些下标引用“链接”在一起而无需临时变量。

关于matlab - 无法使用 ; 获取函数输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40646269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com