2011-12-21 6 views
0

나는 PDL 행렬을 만들었습니다. 각 행을 쌍으로 비교해야합니다. 현재 저는 'where'와 'cov'명령을 사용하여 두 슬라이스에 대한 pairwise 비교를 리턴합니다 (perl 루프에서 생성됨).PDL pairwise 행 비교

내 질문 : 어떻게 '범위'와 '슬라이스'를 사용하여 쌍으로 패션을 반복 할 수 있습니까? 내 색인 위치를 반환하려면 어떻게해야합니까? perl을 사용하여 행렬을 반복했습니다. 필자는 perl로 루핑하는 것이 PDL의 힘을 정말로 못쓰게한다는 것을 읽었습니다.

원하는 출력 :

indexA indexB Value 
pos1 pos5 1 
pos1 pos6 5 
pos1 pos0 7 

가 명확하게하려면 난 단지 PDL 기능을 사용하고 싶습니다.

여기에 내 포인트를 더 잘 설명하는 의사 코드가 있습니다.

p $b 

[ 
[1 0 3 0] 
[0 1 0 1] 
[1 3 1 3] <- example piddle y 
[0 1 0 1] <- example piddle z 
] 

my concept function{ 


slice $b (grab row z) - works fine 
slice $b (grab row y) - works fine 


($a, $b) = where($a,$b, $a < 3 && $b < 3) - works fine 

p $a [1 1] 
p $b [0 0] 

cov($a $b) - works just fine. 

} 

모든 행에서 쌍으로 실행하는 방법이 필요합니다. 계승 (n 행) 비교가 필요합니다.

+0

절망에서 튀어 나와 ... 나는 지금 펄 루프를 쓰고 있지만 유감 스럽다. –

+0

나는 당신이 무엇을 얻고 있는지 잘 모르겠습니다. 사용중인 데이터에 대해보다 구체적인 예를 들려 줄 수 있습니까? –

답변

0

배열의 모든 다른 행 쌍을 찾고 각 쌍을 cov을 사용하여 처리하는 방법을 찾고 있다고 생각하십니까? 그것이 맞다면 나는 cov에 대해 들어 보지 못했고 설명서를 통한 빠른 검색은 도움이되지 않습니다. 그러나 도움이 될만한 몇 가지 사항을 말할 수 있습니다.

PDL을 Perl 코드에서 삭제하는 것에 지나치게주의를 기울이고 있다고 생각합니다. 모든 행 쌍의 색인을 반복하고 slice을 사용하여 그 행을 꺼내면 괜찮습니다. 이것은 아래의 일부 샘플 코드에 나와 있습니다.

$a < 3 등을 부름 연산자라고 부르면 부울 연산자가 사용자가 원하는대로 할 수 없습니다. 대신에 & 연산자를 사용하고 괄호를 추가하여 표현식이 올바른 순서로 실행되는지 확인하십시오.

귀하가 귀하의 질문에 대한 나의 이해를 정정하거나 cov 서브 루틴의 일부 문서로 안내하지 않는 한, 나는 그 이상의 도움을받을 수 없습니다.

use strict; 
use warnings; 

use PDL; 

my $dat = pdl <<END; 
[ 
[1 0 3 0] 
[0 1 0 1] 
[1 3 1 3] 
[0 1 0 1] 
] 
END 

my $max2 = $dat->dim(1) - 1; 

for my $i (0 .. $max2 - 1) { 
    for my $j ($i + 1 .. $max2) { 

    my $row1 = $dat->slice(",($i)"); 
    my $row2 = $dat->slice(",($j)"); 

    ($row1, $row2) = where($row1, $row2, ($row1 < 3) & ($row2 < 3)); 

    cov($row1, $row2); 
    } 
} 
+0

'$ dat'을 초기화하는 방법은 훨씬 더 깨끗할 수 있습니다. 당신은 헤로독을 필요로하지 않습니다. 멀티 라인 문자열을 사용하면됩니다. 주석에 줄 바꿈이 없기 때문에 어렵습니다. 그러나 여는 대괄호 앞에'q'라는 문자를 넣고 heredoc cruft를 제거하면 잘 작동합니다 :'$ dat = q [1 0 3 0; 0 1 0 1; 1 3 1 3; 0 1 0 1];'대괄호 직전에'q '가 의도를 유지하면서 대괄호를 펄 인용으로 바꾼 것을 주목하라. –

+0

@DavidMertens : Perl이 인용하는 방식을 알고 있습니다. 나는 질문에서 데이터를 곧바로 복사 할 수 있도록 heredoc을 사용했다. – Borodin

+0

'q' 연산자를 사용하여 질문에서 데이터를 바로 복사 할 수있다. http://pdl.perl.org/PDLdocs/Core.html#pdl –

1

PDL 스레딩은 여기에서 찾고있는 개념입니다. 치수를 따라 루핑하는 일반적인 방법은 더미 차원을 적절한 위치에 추가하여 암시 적 스레드 루프가 필요한 계산을 생성하도록하는 것입니다. 다차원 문제의 경우 어둑 해지를 추가하여 스레드 루프를 만드는 여러 가지 방법이있을 수 있습니다.

pairwise 행을 계산할 때 슬라이스 인덱스에 두 개의 중첩 루프를 선택할 수 있습니다. 두 개의 중첩 루프는 두 인덱스 수에 대해 펄 루프가 있고 행을 따라 PDL 스레딩을 생성합니다. 하나의 펄 루프를 인덱스에 사용할 수는 있지만 암시적인 쓰레드 루프를 이용하여 모든 로우를 한번에 계산할 수 있습니다.

전체 PDL- 쓰레드 루프 계산은 N ** 2 행 계산 전체를 한꺼번에 계산할 수 있도록 각 인수에 대해 행에 대해 더미 차원을 ​​추가하는 것입니다.

pdl> $b = floor(random(4,3)*5) 

pdl> p $b 

[ 
[0 4 3 3] 
[3 3 4 2] 
[4 0 1 4] 
] 

pdl> p $b(,*3)==$b(,,*3) 

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

결과 형상 [4,3,3]는 0 번째 차원의 행에 대응 헛되이 시간을 보내다된다 : 여기서 계산 == 연산자 인 형상과 [4,3] 어레이의 예는 pairwise 계산의 결과이며 첫 번째 및 두 번째 희미한 점은 == 연산과 관련된 행 인덱스에 해당합니다. 만약 또는 이들 threadloop 계산 중 하나의 인덱스 값이 필요한 경우

인덱스 값이 어레이 축에 대응와 헛되이 시간을 보내다를 생성 xvals, yvals, zvals 또는 axisvals를 사용 .

pdl> p $b->xvals 

[ 
[0 1 2 3] 
[0 1 2 3] 
[0 1 2 3] 
] 


pdl> p $b->yvals 

[ 
[0 0 0 0] 
[1 1 1 1] 
[2 2 2 2] 
] 

는 PDL 스레딩 (펄 스레딩 또는 POSIX 스레드와 동일하지)의 구현에 관한 세부 사항이 많이 있습니다. 다른 PDL 사용자 및 개발자와 참조 및 토론하기 위해 perldl mailing list을 권장합니다. 또한 PDL 계산 및 스레딩에 대해보다 포괄적 인 내용을 담고있는 PDL Book의 첫 번째 온라인 초안을 참조하십시오.

관련 문제