Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab面向对象编程矢量化_Matlab_Oop_Vectorization - Fatal编程技术网

Matlab面向对象编程矢量化

Matlab面向对象编程矢量化,matlab,oop,vectorization,Matlab,Oop,Vectorization,我想为现实世界的问题创建一个模拟,并使用面向对象的编程 例如,我有一个这样的类: 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

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

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

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\u ppl=matrix2(person.age>=50)

首先,要认识到,如果数组中的某些元素属于类
person
,而某些元素属于类
0
,那么所有元素都必须属于同一类

您可以使用单元格数组(而不是数组)来完成此操作,这将是一种解决方案

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

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

然而,这两种解决方案都不是非常有效,因为它们并没有真正利用MATLAB的优势。与其尝试构造一个包含
Person
对象的数组,不如反过来构造一个包含数组的
Person
对象

例如:

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
,这是一个非常糟糕的主意,因为这是一个非常基本的内置函数)

姓名
年龄
身高
将只是空字符串,或者在无人在场的情况下为NaN。如果需要,您可以拥有一个额外的属性
isPresent
,它是一个nxm逻辑阵列,您可以使用它方便地管理有人或没有人的位置。要确保数组之间的一致性,请将其设置为
SetAccess=private
,并为其提供一个方法
addPerson(姓名、年龄、身高、位置)
,该方法将在正确位置添加一个人,同时确保数组在大小和级别等方面保持一致


这将更加有效,并充分利用MATLAB的优势

第一直觉如果你想对一系列对象进行矢量化操作,你必须创建一个
personCollection
对象,该对象可以收集所有这些人,并在此集合类中实现一个方法,该方法可以接受/处理矢量化的输入/输出。首先,你想要一个0,1的随机排序矩阵吗?如果是这样,只需生成一个随机矩阵,例如,
a=rand(1000)
返回一个1000x1000矩阵,其值从0到1。现在你做
A(A=0.5)=1
得到一个0,1的随机矩阵。现在用你的第二个矩阵。。。你想让那些人被随机放在你的“土地”上吗?你是否有足够的人来填写一个完全是一个人的矩阵?不太可能,但毕竟是可能的。是的,它们应该随机放在landI编辑的我的帖子上,是的,这是一个现实世界的问题,
isPresent
属性是一个好主意。这个周末我会尝试一些东西,看看什么最合适。谢谢,你真的可以帮我一点忙:)