3

我正在考虑对 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?

4

1 回答 1

1

基本的 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转置“二维”复杂 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,您可以分别获取实部/虚部并将它们组合起来:

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

或者切片:

pdl> p $m->slice('', '(0)', '(0)')
0 +1i
于 2020-03-04T08:31:00.350 回答