2014-10-31 12 views
11

मान लीजिए मैं एक वेक्टर x करने के लिए एक वेक्टर-मान समारोह phi लागू करना चाहते हैं:सरणी की सरणी को मैट्रिक्स में कैसे परिवर्तित करें?

phi(x, d) = [x.^i for i=0:d] # vector-valued function 
x = rand(7)      # vector 
y = phi(x, 3)     # should be matrix, but isn't 

अब y एक मैट्रिक्स होना चाहिए, लेकिन यह एक 4-element Array{Array{Float64,1},1}, अर्थात सरणियों की एक सरणी है। असल में, मैं एक मैट्रिक्स होने के लिए y चाहता हूं। phi का कार्यान्वयन गलत है? या मैं इसे कैसे परिवर्तित करूं?

धन्यवाद!

उत्तर

9

जैसा कि आपने नोट किया , आप hcat(x...) का उपयोग कर x सरणी की एक सरणी को जोड़ सकते हैं, लेकिन इसके बजाय शुरू करने के लिए आमतौर पर मैट्रिक्स बनाना बेहतर होता है। दो तरीके हैं जिनसे आप इस मामले में यह कर सकते हैं:

  1. प्रसारण का उपयोग करना:

    phi(x, d) = x.^((0:d)') 
    

    जब तक x एक वेक्टर है, यह पंक्ति मैट्रिक्स (0:d)' के खिलाफ प्रसारित करेगा।

    0:d की सीमा के बजाय x को ट्रांसपोज़ करके आप ट्रांसपोज़र परिणाम प्राप्त कर सकते हैं।

  2. एक दो आयामी सरणी समझ का उपयोग करना:

    phi(x, d) = [xi.^di for xi in x, di in 0:d] 
    

    यह रूप में लंबे समय x iterable है के रूप में काम करेंगे। यदि x एक एन-डी सरणी है, तो इसका अर्थ यह होगा कि यह पहले फ़्लैट किया गया था।

    आप समझ चर के आदेश स्विचन द्वारा परिणाम स्थानांतरित कर सकते हैं:

    phi(x, d) = [xi.^di for di in 0:d, xi in x] 
    
8

एक मैट्रिक्स में कनवर्ट कर रहा phi के उत्पादन के रूप में निम्नानुसार किया जा सकता है:

y = hcat(phi(x, 3)...) 

या यदि आप पंक्तियों होने के लिए वैक्टर पसंद करते हैं, एक पक्षांतरित की जरूरत है:

y = vcat([x' for x in phi(x, 3)]...) 

वैकल्पिक रूप से, आप इसे परिभाषित करके phi के भीतर एक मैट्रिक्स में परिवर्तित कर सकते हैं:

phi(x, d) = hcat([x.^i for i=0:d]...) 
संबंधित मुद्दे