2017-11-17 13 views
7

Reshaping मैं निम्नलिखित प्रसारित अभिव्यक्ति काम करने के लिए करना चाहते हैं:एक प्रसारित अभिव्यक्ति

J = rand(4,4) 
fx1 = rand(2,2) 
fx2 = rand(2,2) 
@. J[:,1] = fx1 + fx2 

मैं वास्तव में किसी तरह का हैं:

@. J[:,1] = vec(fx1 + fx2) 

जहां इस vec कह रहा है यह 4x1 होने के लिए नयी आकृति प्रदान करना चाहिए , लेकिन मैं इसे आवंटित नहीं करना चाहता हूं। यह सामान्य रूप से कैसे संभाला जा सकता है (यानी एफएक्स पर कोई अनुक्रमण नहीं)?

+1

'@ के बारे में कैसे। जे [:, 1] = वीसीसी (एफएक्स 1) + वीसीसी (एफएक्स 2) '? यह सिद्धांत रूप में दो अस्थायी आवंटित कर सकता है, लेकिन मुझे लगता है कि संकलक के लिए पर्याप्त आसान है। – gTcV

उत्तर

3

एक और संभावना है, बजाय vecfx1 और fx2 आईएनजी J का टुकड़ा नयी आकृति प्रदान करने की है:

Jcol = reshape(view(J,:,1),(2,2)) 
@. Jcol = fx1 + fx2 

दक्षता के बारे में निश्चित नहीं है, लेकिन यह आसपास के एल्गोरिदम के आधार पर एक स्पष्ट परिप्रेक्ष्य दे सकता है। एलएलवीएम कोड काफी कम लगता है और असाइनमेंट स्टेटमेंट स्पष्ट है।

+0

BenchmarkTools '@btime @ का उपयोग करना। Jcol = fx1 + fx2' 0 आवंटन देता है। –

+2

अच्छा बिंदु। आप यहां 'रीशेप' का उपयोग कर सकते हैं - इसे हमेशा "व्यू" वापस करना चाहिए। वास्तव में, अंतिम क्रमपरिवर्तन के रूप में, मुझे लगता है कि आप इसे '@ के रूप में भी व्यक्त कर सकते हैं। जे [reshape (1: 4, 2, 2), 1)] = fx1 + fx2'। सैद्धांतिक रूप से यह वही प्रदर्शन हो सकता है, लेकिन हमारे पास अभी तक इंडेक्स के रूप में रीशेड रेंज का उपयोग करने के लिए सभी अनुकूलन नहीं हैं, इसलिए यह अब धीमा हो जाएगा। –

+0

सरल 'reshape' के साथ अपडेट किया गया –

2

के बाद से vecs विचारों, निम्न कार्य करता हैं:

J = rand(4,4) 
fx1 = rand(2,2) 
fx2 = rand(2,2) 
vfx1,vfx2 = vec(fx1),vec(fx2) 
@. J[:,1] = vfx1 + vfx2 

मैं वहाँ एक लाइन की तरह मैं चाहता था में यह करने के लिए एक रास्ता है नहीं लगता है, लेकिन यह ठीक है।

3

आप कर सकते हैं "मुक्त" vec@. मैक्रो से एक $ साथ यह रक्षा करते हुए:

julia> expand(:(@. J[:,1] = $vec(fx1) + $vec(fx2))) 
:((Base.broadcast!)(+, (Base.dotview)(J, :, 1), (vec)(fx1), (vec)(fx2))) 
संबंधित मुद्दे