小编hoo*_*one的帖子

如何在MATLAB对象中显示枚举值

鉴于以下两个类

classdef EnumClass

    enumeration
        enumVal1
        enumVal2
    end
end


classdef EnumDisplay

    properties
        enumValue = EnumClass.enumVal1
        numberValue = 1
    end
end
Run Code Online (Sandbox Code Playgroud)

显示时,显示EnumClass该值:

>> E = EnumClass.enumVal1

E = 

    enumVal1
Run Code Online (Sandbox Code Playgroud)

但是EnumDisplay在命令窗口中显示时,枚举值被抑制,只显示数组大小和类.

>> C = EnumDisplay()

C =

  EnumDisplay with properties:

      enumValue: [1x1 EnumClass]
    numberValue: 1
Run Code Online (Sandbox Code Playgroud)

在类属性列表中显示枚举值的最简单方法是什么.也就是说有一个简单而通用的方法让类显示如下:

>> C = EnumDisplay()

C =

  EnumDisplay with properties:

      enumValue: enumVal1
    numberValue: 1
Run Code Online (Sandbox Code Playgroud)

我怀疑这与继承自matlab.mixin.CustomDisplay某个类的类有关,但我希望它尽可能通用,以限制我需要为每个枚举类和/或每个具有枚举的类进行编码的数量财产中的价值.

部分解决方案

我能够找到解决这个问题的部分解决方案,但这并不是很令人满意.

classdef EnumDisplay < matlab.mixin.CustomDisplay

    properties
        enumValue = EnumClass.enumVal1
        numberValue = 1
    end

    methods (Access = …
Run Code Online (Sandbox Code Playgroud)

oop matlab enumeration

7
推荐指数
1
解决办法
858
查看次数

在matlab中覆盖抽象类的empty()方法

我多次遇到过这个问题,我希望最终解决这个问题.

上下文

在MATLAB中创建异构类层次结构时,会调用一个受保护的静态方法getDefaultScalarElement,它允许您定义用于创建数组的默认标量对象.如果层次结构的元素是抽象的,则可以覆盖该方法以使用其他类.

例如

classdef (Abstract) AbstractRoot < matlab.mixin.Heterogeneous

    methods (Static, Access = protected)
        function DefaultObj = getDefaultScalarElement()
            DefaultObj = ConcreteSubclass1();
        end
    end

end

classdef ConcreteSubclass1 < AbstractRoot

end

classdef ConcreteSubclass2 < AbstractRoot

end
Run Code Online (Sandbox Code Playgroud)

matlab中的每个具体类都有一个名为的公共静态隐藏方法empty,它创建该对象的空数组.我想为抽象类创建一个空方法,它的功能与getDefaultScalarObject方法类似.这将允许我调用AbstractRoot.empty()和接收默认类型的空数组.

例如:

classdef (Abstract) AbstractRoot < matlab.mixin.Heterogeneous

    methods (Static, Hidden)
        function EmptyObj = empty()
            EmptyObj = ConcreteSubclass1.empty();
        end
    end

    methods (Static, Access = protected)
        function DefaultObj = getDefaultScalarElement()
            DefaultObj = ConcreteSubclass1();
        end
    end

end
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用(无限递归).我遇到的主要问题是我不知道如何覆盖empty,并且仍然能够从子类调用它的内置版本,因为empty …

oop matlab

5
推荐指数
1
解决办法
678
查看次数

通用* args(特别是zip或zipWith)的Python类型提示

我正在写一个zip_with带有以下签名的函数:

_A = TypeVar("_A")
_B = TypeVar("_B")
_C = TypeVar("_C")


def zip_with(zipper: Callable[[_A, _B], _C], a_vals: Iterable[_A], b_vals: Iterable[_B]) -> Generator[_C, None, None]: ...
Run Code Online (Sandbox Code Playgroud)

就像zip,但是允许您与任意函数进行聚合。对于zip_with仅允许2个参数的实现,此方法效果很好。

是否支持为可变数量的参数添加类型提示?具体来说,我想要一个任意的泛型类型列表,并且希望类型检查器能够将参数的类型与的参数进行匹配zipper。没有特定类型的方法如下:

def zip_with(zipper: Callable[..., _C], *vals: Iterable) -> Generator[_C, None, None]: ...
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望类型检查器能够将的类型*vals与的输入参数进行匹配zipper

python typing mypy

5
推荐指数
1
解决办法
118
查看次数

在Haskell中编写(init,last)的最有效方法

我是Haskell的新手,所以作为练习,我想实现一个类似于uncons返回列表中的元素initlast元素的函数.编写此函数的简便方法是

initLast :: [a] -> ([a], a)
initLast xs = (init xs, last xs)
Run Code Online (Sandbox Code Playgroud)

我是编写haskell程序的新手,但这对我来说似乎效率低下,因为它必须遍历列表两次.我提出了另一个我认为可能更好的功能,因为它不会多次遍历列表:

initLast' :: [a] -> ([a], a)
initLast' [x] = ([], x)
initLast' (x:xs) = let (xs', y) = initLast' xs
                   in (x:xs', y)
Run Code Online (Sandbox Code Playgroud)

但事实证明,当我在ghci中运行这些时,我发现第二个版本的速度慢了两倍,并且使用了大约3倍的内存!

ghci> :set +s
ghci> snd (initLast [1..1000000])
1000000
(0.28 secs, 122242144 bytes)
ghci> snd (initLast' [1..1000000])
1000000
(0.71 secs, 434147544 bytes)
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么第二个版本效率较低?
  2. 有更有效的实施方式initLast吗?

haskell

3
推荐指数
1
解决办法
454
查看次数

标签 统计

matlab ×2

oop ×2

enumeration ×1

haskell ×1

mypy ×1

python ×1

typing ×1