Транспонировать в Perl PDL :: Complex - PullRequest
3 голосов
/ 04 марта 2020

Я рассматриваю сложное расширение языка данных 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?

1 Ответ

1 голос
/ 04 марта 2020

Базовые операции piddle c ведут себя не так, как вы ожидаете, потому что похоже, что сложные piddles реализованы с использованием 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]
]

Например, вы можете получить реальные / мнимые части отдельно и объединить их:

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

Или нарезать пару:

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