2011-03-27 67 views
2

我创建了一个类,它对于所有的实际目的(尽管它比它看起来更复杂)可以被认为是一个matlab实数。在matlab中为一个类重载每个函数操作符

在课堂上,我可以重载大量MATLAB运营商,如加,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} 和概率[1/5,1/5,2/5,1/5]

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

这是否有任何意义?

ps:我没有正式接受面向对象编程的培训,所以我有时候可能会使用错误的词作为概念。

再次感谢您的帮助!

+0

我不太确定你试图你能提供一个想要的行为的例子吗? 您是否正在尝试创建'f(double d)'和'f(int i)',这就是我读取它的方式? – Juhl 2011-03-27 20:39:57

+0

对不起,我不是很清楚。我添加了一些说明 – Cyrano 2011-03-27 21:27:17

回答

1

是的,你可以重载操作符。但是,对于你想要做的事情来说,这是过分的。您只需要使用isreal函数进行简单的输入检查。

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

如果你输入一个复数输入到这个功能,它会显示错误,要不然也不会。现在你可以围绕此建立你的函数,这样所有的代码只有在满足条件时才被执行(所以,在上述end声明之后继续你的函数)

+0

我可能会感到困惑,但我的问题是我想重载*所有*函数。我意识到这可能听起来很疯狂 - 见上面我正在试图做什么.. – Cyrano 2011-03-27 21:38:20

+1

我明白你在做什么,但我不确定这是你需要做什么的正确方法。你正试图获得你的函数的'范围',给定'域'。给定一个域'D = {d1,d2,d3}'和一个函数'f(x)',范围就是'R = f(D)'。现在,就像在你的例子中一样,你会得到重复的值,可以使用函数'unique'将其删除。为了获得每个独特元素的概率,请参见我的答案(http://stackoverflow.com/questions/5385651/frequency-of-numbers-in-vector-matlab/5385787#5385787)。 – abcd 2011-03-27 22:32:18

+1

感谢您的回答。我还有两个问题: a)我的类比包含域和概率(我不想用统计频率计算,因为它太慢)显着更复杂。 b)这个类与许多其他的东西接口,出于用户友好的目的,能够写Z = f(X)比从零开始创建Z并用所有适当的东西填充它要好得多。语法会变得丑陋,并且会消除我想要做的事 - 即处理随机变量的好接口。 – Cyrano 2011-03-27 22:59:23