matlab 正在从Oct2Py返回类对象

m528fe3b  于 2023-02-05  发布在  Matlab
关注(0)|答案(1)|浏览(133)

我正在尝试运行一个基本的MATLAB脚本,它定义了一个类,并将该类对象返回给python。我对MATLAB不太了解,而且对Oct2Py也很陌生,所以我可能完全误解了如何做到这一点。任何帮助都将不胜感激。
以下是Matlab文件(取自here

classdef BasicClass
   properties
      Value {mustBeNumeric}
   end
   methods
      function r = roundOff(obj)
         r = round([obj.Value],2);
      end
      function r = multiplyBy(obj,n)
         r = [obj.Value] * n;
      end
   end
end

我在python脚本中使用以下代码调用它

from oct2py import octave
octave.addpath(r'C:\Users\i13500020\.spyder-py3\IST')
oclass = octave.class_example(nout=1)

当我运行这个程序时,我会收到一个警告,打印四次,然后是一条错误消息
第一:

warning: struct: converting a classdef object into a struct overrides the access restrictions defined for properties. All properties are returned, including private and protected ones.

然后:

TypeError: 'NoneType' object is not iterable

从Oct2Py页面运行roundtrip example没有任何问题,因此我知道我的安装是正确的

q35jwt9p

q35jwt9p1#

我写了一个小的变通方法来使用定制的matlab类和oct2py。目前,这种方法只支持访问Matlab类的成员函数(而不是属性),因为这正是我所需要的:

from oct2py import octave

class MatlabClass():
    _counter = 0
    def __init__(self, objdef) -> None:
        """Use matlab object as python class.

        Args:
            objdef (str): Class initialization as string.
        """
        MatlabClass._counter += 1
        self.name = f"object_for_python{MatlabClass._counter}"
        octave.eval(f"{self.name} = {objdef};")
    
    def __getattr__(self, item):
        """Maps values to attributes.
        Only called if there *isn't* an attribute with this name
        """
        def f(*args):
            call = f"{self.name}.{item}({','.join([str(arg) for arg in args])});"
            return octave.eval(call)
        return f

按如下方式使用此类:

param = 0.24 # random value you might need for class initialization
oclass = MatlabClass(f"BasicClass({param})")
x = oclass.roundOff()
y = oclass.multiplyBy(2)

注意:你可能需要在你的八度音阶代码中有一个init函数来运行设置你的Value变量。

相关问题