Matlab 面向对象的编程矢量化



我想为现实世界的问题创建一个模拟,并使用面向对象的编程。

例如,我有一个这样的类:

classdef person
  properties
    name     % string
    age      % integer
    height   % double (was called 'size' before - which might be a bad idea, see post below)
  end
end

现在我可以创建一个人

p1 = person;

并通过以下方式赋予其属性

p1.name = 'Karl';
p1.age = 35;
p1.size = 1.80;

所以我们有一个叫卡尔的人,他35岁,身高1.80米。

我现在想要的是一个矩阵,假设我有一个岛屿的matrix1,其中所有带有0的条目都是水,所有带有1的条目都代表陆地。现在我想用人随机填充土地,这样到处都是,"土地"在哪里matrix1可以在matrix2中放置一个person,其他一切都是 0。

第一:有没有办法对此进行矢量化?如何非常快速地创建这样的矩阵,而不是使用两个 for 循环逐个元素初始化此元素?

第二:然后,我怎样才能对数据进行虚拟访问?(如old_ppl = matrix2(person.age >= 50)(

首先

,认识到你不能有一个数组,其中某些元素属于类person而某些元素是0的 - 如果它是一个数组,那么所有元素都必须属于同一类。

您可以使用单元数组(而不是数组(来执行此操作,这将是您的一种解决方案。

另一种方法是创建一个抽象类AbstractPerson,继承自matlab.mixin.Heterogeneous,然后有两个子类RealPerson和继承自AbstractPerson的子类NullPerson。通过这种方式,您将能够构造一个类AbstractPerson数组,其中包含类 RealPerson 的元素,并在正确的位置NullPerson。这对您来说将是另一种解决方案。我不确定你的例子是玩具问题还是现实世界的问题;对于玩具问题,这种方法几乎肯定是一个巨大的矫枉过正,但对于现实世界的问题,它可能不是。

您可以相当直接地矢量化上述任一解决方案的构造。

但是,这些解决方案都不是非常有效,因为它们并没有真正利用 MATLAB 的优势。与其尝试构造包含Person对象的数组,为什么不反过来构造一个包含数组的People对象呢?

例如:

classdef People
    properties
        names   % nxm cell array of strings
        ages    % nxm array of integers
        heights % nxm array of heights
    end
end

(注意,我称该属性为height而不是size - 在 MATLAB 中命名任何size是一个非常糟糕的主意,因为这是一个非常基本的内置函数(。

namesagesheights只是空字符串或没有人在场的NaN。如果需要,您可以有一个额外的属性isPresent,它是一个 nxm 逻辑数组,您可以使用它方便地管理有人或没有人的位置。为了确保数组之间的一致性,请使它们SetAccess = private,并为其提供一个方法addPerson(name, age, height, position),该方法将在正确的位置添加一个人,同时确保数组在大小和类等方面保持一致。

这将更加高效,并利用MATLAB的优势。

最新更新