【问题标题】:overloading every function operator for a class in matlab在matlab中为一个类重载每个函数运算符
【发布时间】:2011-07-24 00:59:19
【问题描述】:

我正在创建一个类,出于所有实际目的(尽管它比看起来要复杂得多),可以将其视为 matlab 实数。

在课堂上,我可以重载大量的matlab运算符,比如plus、mpower等。

这可能是不可能的,但是我将如何重载我的类的任何函数? 换句话说,假设我有一个任意函数 f ,它接受实数并输出实数,并说 X 是我的类的一个实例。我希望 f(X) 能够被 matlab 正确解释(当然,我有一种自然的方式来获取函数指针并将其应用于我的类,我会在代码中这样做)。

我可以看到的问题:matlab 可能无法看到函数 f 将实数作为输入。但我会留给用户不要搞乱他们的函数调用。

我说的有道理吗?

我不认为这是可能的,但如果是的话,那就太棒了。

ps:我知道我可以通过创建一个将函数句柄作为输入的方法来解决它,但它不太漂亮..

谢谢!

编辑:

抱歉,我意识到这有点令人困惑。我会更清楚。假设我有一个代表随机真实变量的类(为简单起见,比如说在离散集上)。我的类包含随机变量的概率分布,以及它的可能值。

对于任意两个随机变量 X,Y,总和 X+Y 是很好定义的,所以如果我有代表随机变量的实例 X 和 Y,如果 Z=X+Y 定义一个新的随机变量等于到 X 和 Y 的总和,具有适当的集合和分布。我通过重载加号运算符来做到这一点。挺好的。

假设我有一个任意函数 f,比如说“cos”。好吧,对于任何随机变量 X,cos(X) 也是一个随机变量,如果我可以写 Z=cos(X) 那就太好了,它会自动创建我的类的一个实例,计算适当的域并概率分布。

问题是我希望任何函数 f 都发生这种自动操作 - 我不想手动重载每个常用函数(特别是因为我希望这个技巧与用户定义的函数 f 一起工作)。

再举一个例子: 我创建了一个随机变量 X,其域为 [-2,-1,0,1,2],概率为 [1/5,1/5,1/5,1/5, 1/5]

我创建了一个(奇怪的)函数 f 使得 f(x) = x 如果 x=-2 或 2 f(x) = x^2 否则

然后,通过设置 Z=f(X),我希望 matlab 自动创建一个域 {-2,0,1,2} 的随机变量 Z 和概率 [1/5, 1/5, 2/5, 1/5]

在数学上,我知道如何做到这一点。但是我需要拦截和重载我的类的任何函数调用。

这有意义吗?

ps:我没有受过面向对象编程方面的正式培训,所以有时我可能会用错误的词来表示一个概念。

再次感谢您的帮助!

【问题讨论】:

  • 我不太确定你想要做什么,你能提供一个想要的行为的例子吗?你是想创建f(double d)f(int i),我就是这么读的吗?
  • 对不起,我不是很清楚。我添加了一些说明

标签: matlab operator-overloading


【解决方案1】:

是的,您可以重载运算符。但是,对于您要尝试做的事情,这太过分了。您只需要使用 isreal 函数进行简单的输入检查。

function rejectComplex(inputValue)
    if ~isreal(inputValue)
        error('Input is not a real number')
    end

如果你输入一个复数作为这个函数的输入,它会显示错误,否则它不会。现在您可以围绕此构建您的函数,以便仅在满足条件时执行所有代码(因此,在上面的 end 语句之后继续您的函数)

【讨论】:

  • 我可能会感到困惑,但我的问题是我想重载 all 函数。我意识到这可能听起来很疯狂 - 请参阅上面的内容了解我正在尝试做的事情..
  • 我了解您要尝试做什么,但我不确定这是否是您需要的正确方法。鉴于domain,您正在尝试获取您的函数的range。给定一个域D={d1,d2,d3} 和一个函数f(x),范围就是R=f(D)。现在,就像在您的示例中一样,您将获得重复的值,可以使用函数unique 将其清除。要获得每个独特元素的概率,请see my answer 回答类似问题。
  • 感谢您的回答。我还有两个问题:a)我的类比仅包含域和概率要复杂得多(我不想使用统计频率来计算,因为它太慢了)。 b) 类接口到一堆其他东西,为了用户友好的目的,能够编写 Z=f(X) 比从头开始创建 Z 并用所有适当的东西填充它要好得多。语法会变得丑陋,它会消除我想要做的事情的意义——即处理随机变量的好接口。
  • 我应该补充一点,您的方法正是我计算新域的方式(尽管我希望能够推广到多个输入的函数,在这种情况下我需要扫描所有域随机变量,但我可以用 setprod 很好地做到这一点)。但正如我所说,课堂的内容还有很多。
  • 您应该查看the answer 以了解有关重载的类似问题。那将是一个很好的起点。一旦你了解了所有的算术运算符,大多数函数和用户提供的函数就会到位,因为大多数函数都是建立在基本算术之上的。例外情况可能是拒绝不在特定类中的输入的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多