我想做一些类似以下代码的事情,其中所有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
尚未加载。
我可以想出两种方法来解决这个问题:
-
声明构造函数中属性的大小:
function obj = Example obj.x_data = zeros(1, Example.length_of_vector); %... end
-
用不同的方式定义常量。一种常见的方法是使用函数。您可以将此函数放在
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]