matlab 如何将类属性的大小验证器设置为已知常量

kkih6yb8  于 2022-11-24  发布在  Matlab
关注(0)|答案(2)|浏览(152)

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

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

不同之处在于,大小设置为(1,10)obj.x_data = pi意味着它将x_data设置为1x10向量,其中每个元素都是pi,而大小为(1,:)x.y_data = pi将其设置为1x1pi,这意味着期望输入具有完全相同大小的断点的函数(将数字逐字写入大小比重构初始化代码要容易得多,因为重构初始化代码会执行obj.z_data = 50;操作以在给定高度启动模拟。)

nmpmafwu

nmpmafwu1#

Example.length_of_vector在类的方法内部有效,在类外部也有效。我猜它在你的代码中无效,因为MATLAB在遇到Example.length_of_vector时仍在加载类定义,但Example尚未加载。
我可以想到两种解决方法:
1.在构造函数中声明属性的大小:

function obj = Example
   obj.x_data = zeros(1, Example.length_of_vector);
   %...
end

1.用不同的方法定义常量。常用的方法是使用函数。你可以把这个函数放在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

使用这个方法,您的常数是类别的私用,无法从外部存取。若要将它变成公用,您必须在类别中加入传回常数的静态方法。

5sxhfpxr

5sxhfpxr2#

希望代码有所帮助:

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]

相关问题