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