Matlab 内联函数的按行应用

Matlab 内联函数的按行应用,matlab,vectorization,Matlab,Vectorization,我定义了一个内联函数f,它以(1,3)向量作为参数 假设我有一个大小为(N,3)的矩阵X。如果我想将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 我猜M

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

假设我有一个大小为(N,3)的矩阵
X
。如果我想将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,:)的向量。我怎么做


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

这是正确的,也是预期的

MATLAB试图保持接近数学符号,你所做的(
X*A*X'
for
A
3×3和
X
N×3)是有效的数学,但并不完全是你想要做的——你将得到一个N×N矩阵,你无法将其添加到N×1矩阵中

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

f_vect = @(x) sum( (x*A).*x, 2 ) + x*a + b;
现在,除非你的
N
是巨大的,而且你每天每分钟都要做数十亿次,否则它的性能是完全可以接受的

然而,如果这确实是您程序的瓶颈,那么我建议您看看文件交换。与
permute()
一起,这将允许您使用这些快速BLAS/MKL操作来执行此计算,从而将计算速度提高一个级别

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


您还可以升级到MATLAB R2016b,它将具有内置的隐式维度扩展,可能也适用于
mtimes()
——但最好检查一下,不确定是否存在此问题。

您是否尝试过
bsxfun
?据我从文档中了解,bsxfunc将计算每个元素(而不是每行)的二次形式用A表示X
f_vect = @(x) sum( (x*A).*x, 2 ) + x*a + b;