我想做一些类似下面的代码,其中所有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;
操作以在给定高度启动模拟。)
2条答案
按热度按时间nmpmafwu1#
Example.length_of_vector
在类的方法内部有效,在类外部也有效。我猜它在你的代码中无效,因为MATLAB在遇到Example.length_of_vector
时仍在加载类定义,但Example
尚未加载。我可以想到两种解决方法:
1.在构造函数中声明属性的大小:
1.用不同的方法定义常量。常用的方法是使用函数。你可以把这个函数放在
classdef
文件的末尾,classdef
块之外:使用这个方法,您的常数是类别的私用,无法从外部存取。若要将它变成公用,您必须在类别中加入传回常数的静态方法。
5sxhfpxr2#
希望代码有所帮助:
使用案例:
输出:
然后:
输出:
当您要更改长度时:
输出: