行内智能应用内联函数

时间:2016-10-29 06:41:27

标签: matlab vectorization

我定义了一个内联函数f,它将参数作为参数a(1,3)向量

a = [3;0.5;1];
b = 3 ;
f = @(x) x*a+b ; 

假设我有一个大小为X的矩阵(N,3)。如果我想将f应用于X的每一行,我可以简单地写:

f(X)

我验证了f(X)是(N,1)向量,使得f(X)(i) = f(X(i,:))

现在,如果我添加一个二次项:

f = @(x) x*A*x' + x*a + b ;

命令f(X)引发错误:

Error using +
Matrix dimensions must agree.

Error in @(x) x*A*x' + x*a + b

我猜Matlab正在考虑整个矩阵X作为f的输入。所以它不会创建每行的向量,i,等于f(X(i,:))。我该怎么做 ?

我发现有一个内置函数rowfun可以帮助我,但它似乎仅在版本r2016中可用(我有版本r2015a)

1 个答案:

答案 0 :(得分:1)

这是正确的,也是预料之中的。

MATLAB试图接近数学符号,你正在做什么(X*A*X' A 3×3和X N×3)是有效的数学,但不完全是什么你打算这样做 - 你最终得到一个N×N矩阵,你不能将其添加到N×1矩阵x*a

解决方法很简单,但很难看:

f_vect = @(x) sum( (x*A).*x, 2 ) + x*a + b;

现在,除非你的N是巨大的,,你必须每天每分钟做数十亿次,所以这个性能超出了可接受范围。

然而,这确实是你的程序的瓶颈,而不是我建议在文件交换上查看MMX。与permute()一起,这将允许您使用这些快速BLAS / MKL操作来执行此计算,从而加快它的速度。

请注意bsxfun在这里不起作用,因为它不支持mtimes()(矩阵乘法)。

你也可以升级到MATLAB R2016b,它有内置的隐式尺寸扩展,大概也适用于mtimes() - 但更好的检查,不确定那个。