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



我想做一些类似以下代码的事情,其中所有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将其设置为1x1 pi,这意味着期望输入具有完全相同大小的中断的函数(将数字直接写入大小比重构初始化代码要痛苦得多,后者确实会执行obj.z_data = 50;以在给定高度启动模拟。(

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
    

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

希望代码能有所帮助:

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]

相关内容

  • 没有找到相关文章

最新更新