Matlab:对没有循环的对象进行乘法赋值
我找了好几天的解决办法,但是我被绊倒了。 我有一个简单的对象类:Matlab:对没有循环的对象进行乘法赋值,matlab,class,object,Matlab,Class,Object,我找了好几天的解决办法,但是我被绊倒了。 我有一个简单的对象类: classdef GRIDCELL < handle properties rho end methods %% Constructor function obj = GRIDCELL(rho) if nargin ~= 0 % Allow nargin == 0 syntax obj.rho = rho; end end e
classdef GRIDCELL < handle
properties
rho
end
methods
%% Constructor
function obj = GRIDCELL(rho)
if nargin ~= 0 % Allow nargin == 0 syntax
obj.rho = rho;
end
end
end
end
现在,我想更新所有单元格中的值rho。但不幸的是,这不起作用
C = {11 22 33};
[G(1:3).rho] = C{:};
如果我现在证明这一点,所有的值只会被C中的最后一个值覆盖。我真的不明白:(
内置交易的结果也是一样的。请注意,我搜索了一种简单快速的方法来实现这一点,没有任何类似“num2cell”之类的循环。问题在于初始化对象数组的方式。举个例子: 我的班级
c
,然后再使用它:
>> c = MyClass.empty(3,0);
>> c(3) = MyClass(10);
或
然后,您可以使用逗号分隔列表语法指定所有对象的属性x
:
>> xx = {1,2,3};
>> [c.x] = xx{:}; % or [c.x] = deal(xx{:});
>> c(:).x
ans =
1
ans =
2
ans =
3
我没有测试过你的类代码,但是如果你不使用它,那么它会按预期分配值或
C
。但是我有一个预感,也许问题是你的类正在创建对同一个对象的多个引用,所以如果你给它们中的任何一个赋值,那么你就是在给它们赋值,因为它们都是实际的我只需要引用同一块内存。也许可以尝试for i=1:3 G(i)=GRIDCELL(2);结束并查看是否仍然执行相同的操作?好的,这适用于这种情况:)。但是我在我的真实模型中有一个对象数组,我用为I=1:3g(I,2)=GRIDCELL(2)创建了一个数组;第二列结束
。在这种情况下,所有值都被第一个值C^覆盖。这有点滑稽。我想,这又是多重参照。我怎么能改变这个,我应该改变我的类构造函数吗?我无法想象为什么G(I,2)
会和G(I)
有什么不同。。。除非您必须首先初始化G
?在循环之前尝试G=zero(3,2)
吗?我现在用尝试I=1:3,j=1:3 G(I,j)=GRIDCELL(2);结束
。现在可以了。这是一个选项,我必须一个接一个地创建对象。但是还有另一种可能性吗?这里有一篇相关的帖子:(注意第三点关于将repmat
与句柄类对象一起使用)当然,这不是值类的问题(与句柄类相反):感谢您的详细解释。但如果我想使用对象数组,仍然存在一个问题:G=GRIDCELL.empty(3,3,0)
。现在,如果我想定义它们,我会得到一个错误:for I=1:3 for j=1:3 G(I,j)=GRIDCELL(2);结束沿不明确维度扩展数组的尝试
。我需要这个数组。我有一个解决这个问题的方法。我没有使用G=GRIDCELL.empty(3,3,0)
,而是分配具有最高值的对象:G(3,3)=GRIDCELL(2)
。我得到了一个G(3,3)中的值,其他对象G(1:2,1:2)
刚刚创建。但是我不明白,为什么这不能用empty
-命令你可以只写G=GRIDCELL.empty(3,0)
或者甚至G=GRIDCELL.empty(0,0)
并不重要。如果要使用G=GRIDCELL.empty(3,3,0)
,则必须将第一个对象指定为:G(i,j,1)=GRIDCELL(2)
classdef MyClass < handle
properties
x
end
methods
function obj = MyClass(x)
if nargin ~= 0
obj.x = x;
end
end
end
end
>> clear c
% one object is created, and the same handle assigned to c(1), c(2), and c(3)
>> c(1:3) = MyClass(10)
c =
1x3 MyClass array with properties:
x
% test handle equality
>> c(1) == c(2) % same for c(1) == c(3) and c(2) == c(3)
ans =
1
% changing one object is reflected in all of them
>> c(1).x = 1;
>> c(2).x
ans =
1
>> clear c
% c(3) is first created (with x=10),
% then x(1) and x(2) are default initialized
>> c(3) = MyClass(10)
c =
1x3 MyClass array with properties:
x
% separate objects
>> c(1) == c(2)
ans =
0
% objects are independent
>> c(1).x = 1;
>> c(2).x
ans =
[]
>> c = MyClass.empty(3,0);
>> c(3) = MyClass(10);
>> c = MyClass.empty(3,0);
>> for i=1:3, c(i) = MyClass(i); end % or i=3:-1:1
>> xx = {1,2,3};
>> [c.x] = xx{:}; % or [c.x] = deal(xx{:});
>> c(:).x
ans =
1
ans =
2
ans =
3