【问题标题】:MATLAB How to modify property of a value class from a method within a class that is within the original class?MATLAB如何从原始类中的类中的方法修改值类的属性?
【发布时间】:2019-05-30 17:58:39
【问题描述】:

我想创建一个存储并且能够修改向量的类。看起来像这样:

classdef vect3d
      properties
            vec
            rotate
      end

      methods
            function obj = vec3d(a,b,c)
                  vec = [a,b,c];
                  rotate = rot(obj) ;
            end
      end
end

我还有一个名为 rot 的类;它具有旋转矢量的功能。我想做的是:

MyVec = vec3d([1;2;3]);
MyVec2 = MyVec;

% Define a Directional cosine matrix to rotate the vector
MyDCM = ... ;

MyVec.rotate.byDCM(MyDCM) ;
% MyVec should now contain the rotated vector
% MyVec2 should remain as the original vector

如果我使用句柄类而不是值类,我可以进行这种操作;但是,如果我设置另一个等于 MyVec 的变量,它们就会链接(都指向同一个对象),这是我想要避免的。

我想将指向我的变量的指针传递给 rot 类,以便我可以在 rot 类的函数中操作它。

简而言之: 我希望能够使用

MyVec.rotate.byDCM( MyDCM)

修改 MyVec,而不是在内存中实际创建它的副本。我希望 byDCM 成为旋转中的方法,而不是 MyVec 的方法。而且我希望能够安全地深度复制我的变量。

我希望我清楚地解释了自己。 感谢您的时间。

【问题讨论】:

    标签: matlab class oop handle


    【解决方案1】:

    你想做的

    MyVec = rotate.byDCM(MyVec, MyDCM);
    

    修改传递给函数的变量的唯一方法是,如果它是句柄类,那么您将无法使用 MyVec2 = MyVec 进行深层复制。

    如果rotate.byDCM函数实现如下:

    function vec = byDCM(vec, DCM)
       % modify vec here
    

    然后 MATLAB 将优化事物,使 vec 永远不会被复制。请注意,在函数定义中,相同的变量名称出现在输入和输出列表中。调用函数时,作为该参数传递的同一变量 (MyVec) 也接收输出。 MATLAB 解释器理解这一点,并允许函数就地修改变量。

    参考:https://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/

    【讨论】:

    • 谢谢。正如我所怀疑的那样。假设您无法创建值的句柄版本,就好像它是C中的指针一样,我是否正确?然后将其传递给函数?
    • @Dobacetr:您需要将其设为句柄类。没有办法说“这个变量应该成为句柄”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2023-04-04
    相关资源
    最近更新 更多