我定义了一个内联函数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)
答案 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
是巨大的,和,你必须每天每分钟做数十亿次,所以这个性能超出了可接受范围。
permute()
一起,这将允许您使用这些快速BLAS / MKL操作来执行此计算,从而加快它的速度。
请注意bsxfun
在这里不起作用,因为它不支持mtimes()
(矩阵乘法)。
你也可以升级到MATLAB R2016b,它有内置的隐式尺寸扩展,大概也适用于mtimes()
- 但更好的检查,不确定那个。