使用cell fun从包含对象的单元格提取数据

20次浏览(最近30天)
亚历山大·詹姆斯
亚历山大·詹姆斯 2020年4月30日
大家好,首先,我刚刚开始学习MATLAB,并试图编写一个面向对象的程序来种植和管理森林
我正在尝试编程一个操作,它将“种植”一棵树,然后检查它相对于域中所有其他树的位置。树之间的距离不能小于0.5。我成功了一部分,但后来意识到,我只是在对照前一棵树检查新栽树的位置,而不是对照“森林”中的所有其他树。我试图将操作更改为sqrt((Forest{I}.x-Forest{1:I-1}.x)^2+(Forest{I}.y-Forest{1:I-1}.y))^2<0.5,但在种植第三棵树时,我收到了此错误
期望一个花括号或点索引表达式的输出,但有两个结果。
我看了看,我不能用这种方法检查单元格中所有物体的位置。我考虑使用cellfun,但我不确定这是否是正确的方法,因为它只输出一个图形,是否最好在while循环中创建一个for循环?或者其他方法
谢谢
森林= {};
第一次=橡木((68 - 1)。*兰德(1,1)+ 1(78 - 1)。*兰德(1,1)+ 1,0.25);
森林{1}=第一;
i = 1;
元素个数(森林)< Size_of_intialforest
i=i+1;
如果兰特(1,1)> 0.5
拍摄(i) =橡木((68 - 1)。*兰德(1,1)+ 1(78 - 1)。*兰德(1,1)+ 1,0.25);
其他的
拍摄(i) =桦木((68 - 1)。*兰德(1,1)+ 1(78 - 1)。*兰德(1,1)+ 1,0.2);
结束
拍摄森林{我}=(我)
%检查位置
如果sqrt((森林{i}.x-森林{i-1}.x)^2+(森林{i}.y-森林{i-1}.y))^2<0.5
森林{我}= {};在离最后一棵树太近的地方种植的树被当地社区移走了
我张=;把时钟往回拨一步,重新种植下一棵树
结束
%如果√(森林{我}。1 . cellfun(Tree.x,Forest{1:i-1})^2 + Forest{i}。y - cellfun(Tree.y,Forest{1:i-1}))^2 < 0.5
结束
2的评论
亚历山大·詹姆斯
亚历山大·詹姆斯 2020年4月30日
使用非标量结构可能更容易(而不是标量结构/对象的单元格数组):
谢谢你的回复,我现在不明白非标量结构意味着什么,但我会研究它

登录以发表评论。

公认的答案

Guillaume
Guillaume 2020年4月30日
编辑:Guillaume 2020年4月30日
“目前我并不理解非标量结构意味着什么,但我会研究它”
一个非标量结构简单来说就是一个结构数组:
s(1).x=1234;
(2)。x = 4567;
%s是一个带有字段x的1x2结构
然而,目前您正在将1x1结构(实际上,根据您的描述,我认为它是1x1对象)存储到1D单元数组中,因此您有:
c{1} =结构(“x”, 1234);
c{2} =结构(“x”, 4567);
我认为你使用的是对象而不是结构,但斯蒂芬所说的结构也适用于对象。只要对象是同一类,就可以使用对象数组,而不是将它们存储在单元格数组中。
然而,在您的例子中,您似乎使用了两个不同的类。在这种情况下,为了将所有这些对象放在一个数组中,您必须从中派生每个类 matlab.mixin.heterogeneous .如果它超出了你当前的水平,那么继续使用单元格数组,但你必须意识到,你确实不能写任何类似的东西 森林{b} .您必须使用显式循环或使用 cellfun 和有限公司
计算一棵树与其他树的距离:
森林curtree = {};
Dist = cellfun(@(tree))x - curtree。x,树。y - curtree.y), Forest(1:i-1);
如果任何(dist < 0.5)
%树是接近至少另一棵树
%……
结束
编辑: 实际上,更仔细地看一下您的代码,您的Oak和Birch似乎已经是异构阵列了,因为您已经:
射击(i)=橡树(…)
其他的
拍(我)=桦木(. .)
功能上,单元格数组之间没有区别 森林 标量对象和非标量异构对象 拍摄 . 所以你也可以做:
dist =函数([射击(1:张)。拍摄x] -(我)。x[射击(1张)。y] -拍摄(i) .y);
如果任何(dist < 0.5)
%树是接近至少另一棵树
%……
结束
永远不要打扰我 森林
10评论

登录以发表评论。

更多的答案(0)

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!