2017-06-22 57 views
7

सुप्रभात/दोपहर/शाम काम नहीं करता है,एक समारोह है कि सीधे तत्व के लिहाज से

मैं एक Matlab स्क्रिप्ट कि चौथी क्रम tensors गणना मात्रा अभिन्न शामिल है पर काम कर रहा हूँ एकीकृत करें। चलो एच (आर, थेटा, फाई) वह कार्य हो जिसे मैं एकीकृत करना चाहता हूं। मान लें कि आर, थेटा और फाई पर सरल संचालन से एच प्राप्त नहीं किया जा सकता है।

मेरे समस्या Matlab में किसी भी अन्य कोड के रूप में मुझे पता है कि यह है:

All input functions must accept arrays and operate elementwise. The function FUN(X,Y,Z) 
must accept arrays X, Y, Z of the same size and return an array of corresponding values. 

यह मैटलैब से integral3 function के कार्यान्वयन से है।

अगर मैं इस सरल कार्य के साथ प्रयास करें:

fun = @(X,Y,Z) X.*Y.*Z 

वहाँ सब पर कोई समस्या नहीं है और अगर मैं इस पर एकीकृत [0,1] एक्स [0,1] एक्स [0,1], मैं सही परिणाम प्राप्त करें:

integral3(fun,0,1,0,1,0,1) 

0.125 देता है जो सही है।

समस्या यह है कि जैसा कि मैंने कहा, मैं साधारण गणना वैक्टर के साथ एच प्राप्त करने के लिए प्रदर्शन नहीं कर सकते और मैं चीजों को और अधिक या कम इस तरह से करने को मजबूर कर रहा हूँ:

function [result] = fun(x,y,z) 
    sz = length(x); 
    result = zeros(1,sz); 
    for i=1:sz 
     result(i) = x(i)*y(i)*z(i); 
    end 
end 

यह समारोह अपने पर काम करता है अपने आप को वही परिणाम देता है जैसा कि मैंने पहले पेश किया था। हालांकि, जब मैं integral3 इस्तेमाल करने की कोशिश मैं इस त्रुटि मिलती है:

Error using integral2Calc>integral2t/tensor (line 241) 
Integrand output size does not match the input size 

लेकिन यह स्पष्ट रूप से मेरे समारोह है कि मैं विशेष रूप से यह इनपुट के आकार बना की परिभाषा से देखा जा सकता।

मुझे समझ में नहीं आता कि क्या गलत है और मुझे यकीन नहीं है कि इस तरह के वाक्यविन्यास का उपयोग करने के बजाय इस फ़ंक्शन की गणना करने के लिए मेरे पास कोई अन्य समाधान है।

धन्यवाद आपके समय के लिए एक बहुत और :)

+1

@ ड्रैगन के जवाब में जोड़ने के लिए कुछ भी नहीं, लेकिन मैं सिर्फ इस सुंदर लिखित प्रश्न के लिए धन्यवाद देना चाहता हूं! – Toghe

उत्तर

4

आप सही रास्ते पर हैं, लेकिन आप सही लंबाई लेकिन गलत आकार के साथ एक सरणी का निर्माण कर रहे मदद करते हैं। यह Matlab में एक सूक्ष्म अंतर है। मुझे लगता है कि integral3 कॉलम वेक्टर में गुजर रहा है, लेकिन आपका फ़ंक्शन हमेशा एक पंक्ति वेक्टर देता है। कॉलम और पंक्ति वैक्टरों में समान "लंबाई" sz है, लेकिन विभिन्न "आकार": कॉलम वेक्टर [sz,1] है और पंक्ति वेक्टर [1,sz] है।

function result = fun(x,y,z) 
    sz = size(x); 
    result = zeros(sz); 
    for i = 1:numel(x) 
     result(i) = x(i)*y(i)*z(i); 
    end 
end 

एक अच्छा शासन के-अंगूठे केवल उपयोग करने के लिए है: नीचे कोड आप क्या चाहते हैं, क्योंकि यह size का उपयोग करता है सुनिश्चित करने के लिए कि सभी उत्पादन के आयाम अलग-अलग तत्वों से अधिक इनपुट और numel पाश से मेल करता है size और numel और कभी भी length का उपयोग न करें, जो मैटलैब में सबसे खराब कार्य के लिए एक प्रतियोगी है।

+0

'लंबाई 'सलाह के लिए उपरोक्त! –

+0

@drhagen यह काम करता है जब मैं 'आकार' और 'आकार (1)' और 'आकार (2)' पर एक डबल लूप का उपयोग करता हूं, यदि फंक्शन 'integral3' कॉलम या पंक्ति वेक्टर के बजाय सरणी का उपयोग करता है, धन्यवाद आप ! इसके अलावा, लंबाई सलाह के लिए धन्यवाद! –

+0

@ जेरेमीडिआलो वास्तव में, रैखिक अनुक्रमण के कारण, मेरा संस्करण काम करेगा यदि सरणी के साथ आपूर्ति की जाती है, भले ही इसकी एक सरणी 2 डी, 3 डी, 4 डी, आदि – drhagen

संबंधित मुद्दे