Matlab对象方法无法接收参数,请求问题排查与解决指导
MATLAB面向对象编程:方法参数报错与属性修改失效解决
核心问题拆解
你的代码有两个致命问题,直接引发参数报错和属性修改无效:
- 方法缩进错误:
K3TransMeshO方法被错误缩进在构造函数的作用域内,MATLAB不允许类方法嵌套,导致它无法被识别为K3MeshObject的公共方法,这是「输入参数过多/缺失」报错的直接原因。 - 值类属性修改规则未遵守:MATLAB默认类是值类,值类对象是传值传递,方法内部修改属性后必须返回修改后的对象,否则原对象不会有任何变化。你的方法既没返回对象,调用时也没接收返回值,就算方法定义正确,属性也改不了。
修正后的完整代码
1. 修复类定义(修正缩进+添加返回值)
classdef K3MeshObject properties Xs Ys Zs Ts n m end methods % 构造函数 function obj=K3MeshObject(Xg,Yg,Zg) % g stands for "given". if nargin == 3 obj.Xs=Xg; obj.Ys=Yg; obj.Zs=Zg; obj.n=min([size(obj.Xs,1),size(obj.Ys,1),size(obj.Zs,1)]); obj.m=min([size(obj.Xs,2),size(obj.Ys,2),size(obj.Zs,2)]); obj.Ts=ones(obj.n,obj.m); end end % 修正后的属性修改方法 function obj = K3TransMeshO(obj,K) for jj=1:obj.n for ii=1:obj.m V=K3Euclid(K*[obj.Xs(jj,ii);obj.Ys(jj,ii);obj.Zs(jj,ii);obj.Ts(jj,ii)]); obj.Xs(jj,ii)=V(1); obj.Ys(jj,ii)=V(2); obj.Zs(jj,ii)=V(3); obj.Ts(jj,ii)=V(4); end end end end end
2. 修正调用逻辑(接收修改后的对象)
function K3ShowTotem(wind, Xo) K3Header % Build the totem Pillar = K3MeshObjectCopy(K3UnitCube); % 值类必须接收返回的修改后对象,否则原对象不会更新 Pillar = Pillar.K3TransMeshO(diag([2, 3, 1, 1])); % 也可以用函数式调用: % Pillar = K3TransMeshO(Pillar, diag([2, 3, 1, 1])); end
额外优化方案:使用句柄类
如果不想每次修改都接收返回值,可以把类改成句柄类,只需在classdef后添加< handle:
classdef K3MeshObject < handle % 其余代码完全不变 end
句柄类是传引用传递,修改属性时无需返回对象,直接调用Pillar.K3TransMeshO(diag([2, 3, 1, 1]))就能生效,更符合你原本的调用习惯。
内容的提问来源于stack exchange,提问作者Xirdal
相关产品推荐
相关产品推荐

