在我正在编写的程序中,我有一个执行一些矢量化线性运算(特别是微分)的子例程。假设为方便起见,我定义了以下内联函数,它近似于 3D 数组的偏导数:
这是一个线性变换,它显然具有矩阵表示。有没有一种简单的方法来导出其转置的索引形式?如果可能的话,我想避免构建矩阵,因为数组公式更简洁(而且我已经实现了它......)。“内部”网格点似乎很明显——转置也是一个差分算子。但是有没有一种简单的方法来查看边界项是什么?
谢谢!
在我正在编写的程序中,我有一个执行一些矢量化线性运算(特别是微分)的子例程。假设为方便起见,我定义了以下内联函数,它近似于 3D 数组的偏导数:
这是一个线性变换,它显然具有矩阵表示。有没有一种简单的方法来导出其转置的索引形式?如果可能的话,我想避免构建矩阵,因为数组公式更简洁(而且我已经实现了它......)。“内部”网格点似乎很明显——转置也是一个差分算子。但是有没有一种简单的方法来查看边界项是什么?
谢谢!
我不知道这样做的一般方法,但通常不可能用如此简单的矢量化表达式编写给定线性运算符的转置。考虑您的示例,但应用于简单的 1d 向量x而不是 3d 数组,我将调用此函数:
G = @(x) ( x(3:end)-x(1:end-2) )/(2*h)
Gtranspose = @(x) [-x(1:2); x(1:end-2)-x(3:end); x(end-1:end)]/(2*h);造成差异的主要原因G是非正方形的事实。如果运算符是正方形且对称或反对称,则可以很容易地完成您的要求。您可能知道,对称算子是它自己的转置,反对称算子的负数是它的转置。例如,您的导数运算符几乎是反对称的。如果考虑周期性边界条件,则算子是对称的,可以写为
H = @(X) [ X(end,:,:) - X(2,:,:); ...
X(3:end,:,:) - X(1:end-2,:,:); ...
X(end-1,:,:)-X(1,:,:) ]/(2*h);
然后转置由给出,所以
Htranspose = @(X) [ X(2,:,:) - X(end,:,:); ...
X(1:end-2,:,:) - X(3:end,:,:); ...
X(1,:,:) - X(end-1,:,:) ]/(2*h);
这种方法应该适用于基于中心差分的有限差分,这些差分总是对称(偶数导数)或反对称(奇数导数)。