1

我想做类似下面的代码,其中所有 3 个属性都是静态已知的大小(1,10),而不必显式地重新编写10at 属性声明。

classdef Example
    properties(Constant)
        length_of_vector = 10;
    end
    properties
        x_data(1, Example.length_of_vector);
        y_data(1, Example.length_of_vector);
        z_data(1, Example.length_of_vector);
    end
end

这种语法无效,有没有办法在不重写10所有三个地方的情况下做到这一点?我的真实用例有几个尺寸静态已知的尺寸,我真的希望能够在声明中指定它们的长度,以便维护人员知道预期的尺寸,但可以更改常量并自动更新取决于它的所有属性大小。

为了澄清我可以做一些选择:

classdef Example
    properties(Constant)
        length_of_vector = 10;
    end
    properties
        % this gives the behaviour at runtime I want but don't want to have to specify the 10 literally
        x_data(1, 10);
        % this gives the correct initial conditions but is not quite the same thing
        y_data(1, :) = zeros(1,Example.length_of_vector);
        % this is what I am using now, if you change length_of_vector without modifying the
        % 10 here it throws an error immediately so you get pointed to where you have to fix it
        z_data(1, 10) = zeros(1,Example.length_of_vector);
    end
end

这些不同的方式是,obj.x_data = pi将大小设置为(1,10)意味着它将 设置x_data为 1x10 向量,其中每个元素是 pi,其中x.y_data = pi哪个大小(1,:)将其设置为 1x1 pi,这意味着期望输入具有完全相同大小的函数中断(并且将数字从字面上写入大小比重构初始化代码要少痛苦,后者确实可以obj.z_data = 50;在给定高度启动模拟。)

4

2 回答 2

2

Example.length_of_vector在类的方法内部有效,在类外部也是有效的。我猜它在您的代码中无效,因为 MATLAB 在遇到 时仍在加载类定义Example.length_of_vector,但Example尚未加载。

我可以想到两种方法来解决这个问题:

  1. 在构造函数中声明属性的大小:

    function obj = Example
       obj.x_data = zeros(1, Example.length_of_vector);
       %...
    end
    
  2. 以不同的方式定义常量。一种常用的方法是使用函数。您可以将此函数放在classdef文件末尾的classdef块之外:

    classdef Example
        properties
            x_data(1, length_of_vector);
            y_data(1, length_of_vector);
            z_data(1, length_of_vector);
        end
    end
    
    function l = length_of_vector
       l = 10;
    end
    

    使用此方法,您的常量对您的类来说是私有的,无法从外部访问。要使其公开,您必须向您的类添加一个返回常量的静态方法。

于 2021-12-09T19:43:28.070 回答
1

希望代码帮助:

classdef Example  
        properties 
            length_of_vector = 10;
            x_data ;
            y_data ;
            z_data ;
        end
        methods 
             % if u wont change the properties use function obj = Example()
             % if u want to change the properties use function obj = New_value(obj)
             function obj = New_value(obj)
             obj.x_data = zeros(1, obj.length_of_vector);
             obj.y_data = zeros(1, obj.length_of_vector);
             obj.z_data = zeros(1, obj.length_of_vector);
          end
        end
    end

用例:

a = Example;

输出 :

a = 
   length_of_vector: 10
              x_data: []
              y_data: []
              z_data: []

然后 :

a.New_value;

输出 :

a = 
     length_of_vector: 10
              x_data: [0 0 0 0 0 0 0 0 0 0]
              y_data: [0 0 0 0 0 0 0 0 0 0]
              z_data: [0 0 0 0 0 0 0 0 0 0]

当你想改变长度时:

a.length_of_vector = 15;
a.New_value

输出 :

a = 
      length_of_vector: 15
              x_data: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
              y_data: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
              z_data: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
于 2021-12-09T20:19:32.043 回答