我有一个矩阵A
:
A=[ x.^2 + y , 0;
0 , x.^2 + y ]
我还有一个运算符矩阵D
:
D = [d/dx , 0;
0 , d/dy ]
我希望能够乘以D*A
并最终得到一个看起来像这样的矩阵:
B = [ diff(A(1,1),x) , 0 ;
0 , diff(A(2,2),y) ]
显然我不能用diff()函数做到这一点,因为该函数不是可以乘以函数的运算符。那么我怎样才能使用符号运算符呢?实际上,我的矩阵很大,因此在没有算子乘法的情况下执行是不可取的。
另外,假设我找到了一种生成上述B
矩阵的方法,如下所示:
B =
[ 2*x, 0
0, 1]
如何评估B
,例如x=2, y=1
;
我的尝试:
subs(B,x,2,y,1)
但这显然是sym.subs
函数
我也尝试过:
subs(B,2,1)
这也不起作用,所以我的另一个问题是如何替换x
矩阵中的y
和B
。
答案 0 :(得分:0)
对于第二个问题:将多个值替换为符号变量的语法是
subs(B, {x,y}, {2,1})
(在Matlab命令提示符下输入help subs
会给出这个例子)。
首先:你通过矢量化来加速计算符号衍生物的想法是行不通的。 Vectorization对于可以由一些用于处理数组的现有C ++库批量执行的低级操作有意义。符号差异是完全不同的:为每个表达式运行一个复杂的算法。无论有多少,使用for循环来找到多个符号导数都是合适的。如果需要很长时间,那是因为服用大量符号衍生物需要很长时间。
我要寻找的一个可能的优化是在矩阵B中的函数之间找到共同的元素,以便它们可以区分一次。但这需要处理矩阵中包含的函数的细节。
答案 1 :(得分:0)
看看这里:https://www.mathworks.com/matlabcentral/answers/36580-operator-matrix-for-matrix-differentiation
function dNdv = diffmtx(v,N)
% v -vector m x 1 - sym array
% N - matrix m x n - sym array
rz = arrayfun(@(ii)diff(N(ii,:),v(ii)),(1:numel(v)).','un',0);
dNdv = cat(1,rz{:});
end