导出向量化操作转置的简单方法

计算科学 matlab 矩阵
2021-12-08 01:55:37

在我正在编写的程序中,我有一个执行一些矢量化线性运算(特别是微分)的子例程。假设为方便起见,我定义了以下内联函数,它近似于 3D 数组的偏导数:

F=@(X)(X(3:end,:,:)X(1:end2,:,:))/(2h)

这是一个线性变换,它显然具有矩阵表示。有没有一种简单的方法来导出其转置的索引形式FT如果可能的话,我想避免构建矩阵,因为数组公式更简洁(而且我已经实现了它......)。“内部”网格点似乎很明显——转置也是一个差分算子。但是有没有一种简单的方法来查看边界项是什么?

谢谢!

1个回答

我不知道这样做的一般方法,但通常不可能用如此简单的矢量化表达式编写给定线性运算符的转置。考虑您的示例,但应用于简单的 1d 向量x而不是 3d 数组,我将调用此函数G(x)
G = @(x) ( x(3:end)-x(1:end-2) )/(2*h)

  • G对长度为的向量进行运算并返回长度为nn2
  • 如果我把写成一个矩阵,它是 G
    G(n2)×n=12h[101000101000101]
  • G的转置为G G
    Gn×(n2)=12h[100011000110001]
  • 有几种明显的方法可以为的表达式那样简单例如:GxG
    Gtranspose = @(x) [-x(1:2); x(1:end-2)-x(3:end); x(end-1:end)]/(2*h);

造成差异的主要原因G是非正方形的事实。如果运算符是正方形且对称或反对称,则可以很容易地完成您的要求。您可能知道,对称算子是它自己的转置,反对称算子的负数是它的转置。例如,您的导数运算符几乎是反对称的。如果考虑周期性边界条件,则算子是对称的,可以写为F

H = @(X) [ X(end,:,:) - X(2,:,:); ...
           X(3:end,:,:) - X(1:end-2,:,:); ...
           X(end-1,:,:)-X(1,:,:) ]/(2*h);

然后转置由给出,所以H=H

Htranspose = @(X) [ X(2,:,:) - X(end,:,:); ...
                    X(1:end-2,:,:) - X(3:end,:,:); ...
                    X(1,:,:) - X(end-1,:,:) ]/(2*h);

这种方法应该适用于基于中心差分的有限差分,这些差分总是对称(偶数导数)或反对称(奇数导数)。