2009-03-03 20 views
9

में मैट्रिस के मैट्रिस एक पर्ल स्क्रिप्ट में मैं काम कर रहा हूं, मुझे कई अन्य मैट्रिक्स से मैट्रिक्स बनाने की आवश्यकता है। मैंने सीपीएएन (Math::Matrix, PDL::Matrix, Math::Cephes::Matrix) में कुछ मॉड्यूल देखे हैं, लेकिन इनमें से कोई भी इसका समर्थन नहीं करता है।पर्ल

ऑक्टवे में, यह बहुत आसान है। यहाँ मैं क्या कर रहा हूँ करने के लिए कुछ इसी तरह का एक उदाहरण है:

octave:1> A = [ 1, 2; 3, 4 ] 
A =  
    1 2 
    3 4 

octave:2> B = [ 5, 6; 7, 8 ] 
B =  
    5 6 
    7 8 

octave:3> C = [ 9, 10; 11, 12 ] 
C =  
    9 10 
    11 12 

octave:4> D = [ 13, 14; 15, 16 ] 
D =  
    13 14 
    15 16 

octave:5> E = [ A, B; C, D ] 
E =  
    1 2 5 6 
    3 4 7 8 
    9 10 13 14 
    11 12 15 16 

यह यह करने के लिए कोशिश कर रहा है लगता है अपने आप थोड़े जल्दी से गंदा मिलेगा, जो शायद यही वजह है इन मॉड्यूल इसका समर्थन नहीं करते ... है किसी और के पास कभी इसकी आवश्यकता थी? क्या आपने इसे हल किया है?

+0

एक बेहतर उत्तर देने में सक्षम हो सकता है अगर हम जानते हैं कि आप उनके लिए क्या उपयोग कर रहे हैं ... – flussence

+0

चूंकि आपके पास कोई टिप्पणी पोस्ट करने की प्रतिष्ठा नहीं है, तो प्रश्न को स्वयं संपादित करके जवाब देने में संकोच न करें। –

उत्तर

5

अपना रोलिंग बहुत दर्दनाक नहीं है।

use List::Util qw(max); 

@A = ([1, 2], [3, 4]); 
@B = ([5, 6], [7, 8]); 
@C = ([9, 10], [11, 12]); 
@D = ([13, 14], [15, 16]); 

sub hmerge(\@\@;\@\@\@\@\@\@) { 
    my @ret; 
    for my $i (0 .. max map $#$_, @_) { 
     push @ret, [map @{$$_[$i]}, @_]; 
    } 
    @ret; 
} 

@E = (hmerge(@A, @B), hmerge(@C, @D)); 
+0

यह खूबसूरती से काम किया। मैं इस प्रश्न पूछने के लिए उपयोग किए जाने वाले अस्थायी खाते पर वापस नहीं आ सकता, लेकिन जैसे ही मुझे यह खाता मिला है, मैं इसे स्वीकार कर दूंगा। हालांकि मैं थोड़ा उलझन में हूं- \ @ \ @; \ @ \ @ \ @ \ @ \ @ \ @ क्या है? –

+0

फ़ंक्शन प्रोटोटाइप - पर्ल 5 में लगातार उपयोग में नहीं। यहां, यह सरणी तर्कों के स्क्वैशिंग को रोकता है; आप पूरे प्रोटोटाइप को छोड़ सकते हैं और इसके बजाय 'hmerge (\ @ ए, \ @B) 'का उपयोग कर सकते हैं। – ephemient

-1

संपादित

मैं ओ पी गलत समझा, यह सोचकर कि वे कई मैट्रिक्स के सभी संभव क्रमपरिवर्तन से अधिक पुनरावृति करने के लिए (जो क्या इटरेटर :: सरणी :: दांतेदार करता है) चाहता था।


Iterator::Array::Jagged

यहाँ पर एक नजर डालें सार से एक उदाहरण है:

use Iterator::Array::Jagged; 

# Build up a set of data: 
my @data = (
    [qw/ a b /], 
    [qw/ c d /], 
    [qw/ e f g /] 
); 

# Iterator is a subref: 
my $itersub = Iterator::Array::Jagged->get_iterator(@data); 
while(my @set = $itersub->()) 
{ 
    print "Next set: '" . join("&", @set) . "'\n"; 
}# end while() 

कोड उपरोक्त कोड में उदाहरण प्रिंट निम्नलिखित:

Next set: 'a&c&e' 
Next set: 'b&c&e' 
Next set: 'a&d&e' 
Next set: 'b&d&e' 
Next set: 'a&c&f' 
Next set: 'b&c&f' 
Next set: 'a&d&f' 
Next set: 'b&d&f' 
Next set: 'a&c&g' 
Next set: 'b&c&g' 
Next set: 'a&d&g' 
Next set: 'b&d&g' 
+0

मुझे नहीं लगता कि यह कैसे मदद करता है? ओपी का उदाहरण छोटे मैट्रिक्स से बड़े मैट्रिक्स को बना देता है। – ephemient

+0

मैंने पूरी तरह से इस सवाल को गलत समझा। मैंने सोचा कि ओपी कई मैट्रिक्स के सभी संभावित क्रमिकरणों के माध्यम से पुन: प्रयास कर रहा है। – JDrago

0

Perl Data Language (पीडीएल) संस्करण 2.4.10 MATLAB-style सुविधा inp का समर्थन करता है pdl निर्माता के लिए केन्द्र शासित प्रदेशों के एक स्ट्रिंग तर्क का उपयोग करते समय और append और glue दिनचर्या के रूप में इस pdl2 सत्र से पता चलता subarrays एक साथ चिपकाने के लिए इस्तेमाल किया जा सकता:

pdl> $A = pdl q[ 1, 2 ; 3, 4 ];  # pdl constructor with string argument 

pdl> $B = pdl q[ 5, 6 ; 7, 8 ];  # pdl constructor with string argument 

pdl> $C = pdl q[ 9, 10 ; 11, 12 ]; # pdl constructor with string argument 

pdl> $D = pdl q[ 13, 14 ; 15, 16]; # pdl constructor with string argument 

pdl> ?vars 
PDL variables in package main:: 

Name   Type Dimension  Flow State   Mem 
---------------------------------------------------------------- 
$A   Double D [2,2]    P   0.03KB 
$B   Double D [2,2]    P   0.03KB 
$C   Double D [2,2]    P   0.03KB 
$D   Double D [2,2]    P   0.03KB 


pdl> p $A, $B, $C, $D; 

[ 
[1 2] 
[3 4] 
] 

[ 
[5 6] 
[7 8] 
] 

[ 
[ 9 10] 
[11 12] 
] 

[ 
[13 14] 
[15 16] 
] 

pdl> p $AB = $A->append($B);   # concatenate horizontally (actually on dim(0)) 

[ 
[1 2 5 6] 
[3 4 7 8] 
] 

pdl> p $CD = $C->append($D);   # concatenate horizontally (actually on dim(0)) 

[ 
[ 9 10 13 14] 
[11 12 15 16] 
] 

pdl> p $E = $AB->glue(1,$CD);   # glue vertically (actually on dim(1)) 
[ 
[ 1 2 5 6] 
[ 3 4 7 8] 
[ 9 10 13 14] 
[11 12 15 16] 
] 

PDL book और PDL mailing lists पीडीएल बारे में अधिक जानकारी के लिए आवश्यक स्रोत हैं।