我想为现实世界的问题创建一个模拟,并使用面向对象的编程。
例如,我有一个这样的类:
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
是一个非常糟糕的主意,因为这是一个非常基本的内置函数(。
names
,ages
和heights
只是空字符串或没有人在场的NaN。如果需要,您可以有一个额外的属性isPresent
,它是一个 nxm 逻辑数组,您可以使用它方便地管理有人或没有人的位置。为了确保数组之间的一致性,请使它们SetAccess = private
,并为其提供一个方法addPerson(name, age, height, position)
,该方法将在正确的位置添加一个人,同时确保数组在大小和类等方面保持一致。
这将更加高效,并利用MATLAB的优势。