在 Perl 中转置 PDL::Complex

Transpose in Perl's PDL::Complex

我正在考虑复杂矩阵运算的 Perl 数据语言 (PDL 2.19.0) 的复杂扩展,但是像转置这样简单的运算并不像我期望的那样工作。

use strict;
use warnings;

use PDL;
use PDL::Complex;

my $m = cplx pdl [i, 1], [-1, -i];

printf "m=%s\n", $m; 
my $mt = $m->transpose;
printf "m=%s\n", $m; 
printf "mt=%s\n", $mt;
my $mx = $m->xchg(1,2);
printf "m=%s\n", $m; 
printf "mx=%s\n", $mx;

对我来说 $m->transpose 似乎等于 $m。另一个让我烦恼的理应简单的操作:

printf "m[0,0]=%s\n", $m->at(0,0);

不行,只有

printf "m[0,0,0]=%s\n", $m->at(0,0,0);

确实如此。我是否以错误的方式使用了 API?

基本的 piddle 操作并不像您预期​​的那样运行,因为看起来复杂的 piddle 是使用第 0 维存储实部和虚部对来实现的。如果您检查 dimsreal:

就可以看到这一点
pdl> $m = cplx pdl [i, 1], [-1, -i];

pdl> p $m->dims
2 2 2
pdl> p $m->real

[
 [
  [0 1]
  [1 0]
 ]
 [
  [-1  0]
  [ 0 -1]
 ]
]

因此,您可以使用 xchg 而不是 transpose 来转置 "two-dimensional" 复数 piddle 的正确维度:

pdl> p $m

[
 [ 0 +1i   1 +0i]
 [-1 +0i   0 -1i]
]

pdl> p $m->xchg(1, 2)

[
 [ 0 +1i  -1 +0i]
 [ 1 +0i   0 -1i]
]

对于at,可以分别取real/imaginary个部分再组合:

pdl> p cplx pdl $m->at(0,0,0), $m->at(1,0,0)
0 +1i

或切分对:

pdl> p $m->slice('', '(0)', '(0)')
0 +1i