在 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 维存储实部和虚部对来实现的。如果您检查 dims
或 real
:
就可以看到这一点
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
我正在考虑复杂矩阵运算的 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 维存储实部和虚部对来实现的。如果您检查 dims
或 real
:
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