【问题标题】:Matlab ObjectOrientated Programming VectorizeMatlab面向对象编程矢量化
【发布时间】:2014-12-06 17:22:25
【问题描述】:

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

例如我有一个这样的类:

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;

所以我们有一个叫 Karl 的人,他 35 岁,身高 1.80m。

我现在想要的是一个矩阵,假设我有一个岛的matrix1,其中0 的所有条目都是水,1 的所有条目都代表陆地。现在我想用人随机填充土地,这样在matrix1上的“土地”的任何地方都可以在matrix2中放置一个person,其他一切都再次为0。

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

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

【问题讨论】:

  • 第一个直觉,如果你想对一系列对象进行矢量化操作,你必须创建一个personCollection 对象来收集所有这些人,并在这个集合类中实现一个方法,它可以获取/处理矢量化输入/输出。
  • first 你想要一个随机排序的 0,1 矩阵吗?如果是这样,只需生成一个随机矩阵,例如A=rand(1000) 返回一个 1000x1000 的矩阵,其值从 0 到 1。现在您执行 A(A<0.5)=0;A(A>=0.5)=1; 并得到一个 0,1 的随机矩阵。现在有了你的第二个矩阵......你想让那些人随机放置在你的“土地”上吗?你有足够的人来填充一个完全是一个矩阵的人吗?不太可能,但毕竟是可能的。
  • 是的,它们应该随机放置在土地上

标签: matlab oop vectorization


【解决方案1】:

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

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

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

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

但是,这些解决方案都不是非常有效,因为它们并没有真正利用 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 的优势。

【讨论】:

  • 我编辑了我的帖子,是的,这是一个现实世界的问题,isPresent 属性是个好主意。这个周末我会尝试一些东西,看看什么最适合。谢谢你,你实际上可以帮助我一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
相关资源
最近更新 更多