2015-11-26 3 views
11

जब सी कोड MATLAB सांकेतिक शब्दों में बदलनेवाला का उपयोग कर पैदा करने के साथ उत्पादन आकार infers, व्यवहार भिन्न एक if एक और if के मुख्य भाग में या उसके else खंड में होता है जब है। निम्नलिखित मामले आसानी से उत्पादन होने आकार 5x5 के साथ सी कोड बनाता है:कैसे MATLAB कोड पीढ़ी नेस्टेड शाखाओं

function y = foo1(u) 
if u > 0 
    y = zeros(2,2); 
else 
    y = zeros(5,5); 
end 

अब इस एक के रूप में अच्छी तरह से काम करता है

function y = foo2(u,v) 
if u > 0 
    y = zeros(2,2); 
else 
    y = zeros(5,5); 
    if v > 0 
     y = 2 * y; 
    end 
end 

लेकिन यह एक कोड उत्पन्न करने के लिए विफल रहता है, आकार बेमेल के बारे में शिकायत:

function y = foo3(u,v) 
if u > 0 
    y = zeros(2,2); 
    if v > 0 
     y = 2 * y; 
    end 
else 
    y = zeros(5,5); 
end 

यहां कमांड लाइन में आउटपुट है:

>> codegen foo1.m -args {0} 
>> codegen foo2.m -args {0,0} 
>> codegen foo3.m -args {0,0} 
??? Size mismatch (size [2 x 2] ~= size [5 x 5]). 
The size to the left is the size of the left-hand side of the assignment. 

Error in ==> foo3 Line: 8 Column: 5 
Code generation failed: Open error report. 
Error using codegen (line 144) 

मैंने MATLAB R2013b और R2015a में यह व्यवहार देखा है।

उत्तर

7

the docs से, मैटलैब codegen संकलन समय जब तक codegen बताया या infers कि मैट्रिक्स चर आकार की है है पर एक मैट्रिक्स के आकार पता होना चाहिए। वहाँ मैटलैब पता एक मैट्रिक्स चर आकार की हो जाएगा जाने के लिए कई तरीके हैं:

  1. coder.varsize समारोह का उपयोग करना, एक मैट्रिक्स स्पष्ट रूप से चर आकार की घोषित किया जा सकता है।
  2. MATLAB एक मैट्रिक्स कोड की संरचना से परिवर्तनीय आकार का अनुमान लगा सकता है।

जैसा कि आपका कोड सुझाता है, विकल्प (2) स्पष्ट रूप से मजबूत नहीं है। Matlab कुछ मामलों में अनुमान लगाने की कोशिश करता है जब एक साधारण ifelse कथन है, लेकिन यह अनुमान आपके उदाहरण के अनुसार दिखाया गया है, लेकिन यह अनुमान काफी नाजुक प्रतीत होता है।

function y = foo3(u,v) 
    coder.varsize('y', []); % Let codegen know y is variable sized 
          % and can be arbitrary dimensions 
          % an alternative is: coder.varsize('y',[5,5]); 
    if u > 0 
    y = zeros(2,2); 
    if v > 0 
     y = 2 * y; 
    end 
    else 
    y = zeros(5,5); 
    end 

क्यों मैटलैब इस जानकारी पता करने के लिए चाहते हो सकता है:

MATLAB पर भरोसा करने के बजाय सही ढंग से अनुमान एक मैट्रिक्स चर आकार है या नहीं, एक समाधान के लिए कोई स्पष्ट घोषणा बनाने के लिए है के लिए? यदि एक मैट्रिक्स का आकार संकलन समय पर जाना जाता है, तो सभी प्रकार के अतिरिक्त अनुकूलन संभव हो सकते हैं (लूप अनोलिंग आदि ...)।

+1

बस स्पष्ट करने के लिए, क्योंकि इसका स्पष्ट रूप से उल्लेख नहीं किया गया था: 'coder.varsize ('y', [5,5])' मैट्रिक्स के चर आकार के लिए '5 5]' * ऊपरी बाउंड * के रूप में निर्दिष्ट करता है । एक या अधिक आयामों को निश्चित रूप से निर्दिष्ट करना और दूसरों को परिवर्तनीय आकार के रूप में निर्दिष्ट करना भी संभव है - उत्तर में लिंक किए गए दस्तावेज़ पृष्ठ में यह और अधिक। – mikkola

+2

वर्थ नोटिंग यह है कि ओपी में कोई भी उदाहरण मान्य नहीं है। यदि किसी कथन के अंदर घोषित किया गया है तो चर में अलग-अलग दायरे होंगे। चूंकि यह कोड मैटलैब में काम करता है, इसलिए उम्मीद है कि मैटलैब कोडर इसे हल करने में सक्षम होगा, लेकिन कोई इसे नहीं मान सकता है। मुझे लगता है कि 'foo3' में समस्या को' y' के साथ करना है यदि if statement ('y = 2 * y') में उपयोग किया जाता है और फिर अन्य कथन में फिर से परिभाषित किया जाता है, जिसे बाद में पाठ में लिखा जाता है। मुझे लगता है कि यह मैटलैब कोडर को भ्रमित करता है। हालांकि मैं पूरी तरह से यकीन नहीं कर रहा हूँ। – patrik

+0

@patrik, उदाहरणों को वैध सी होने की आवश्यकता नहीं है। MATLAB कोडर का काम MATLAB भाषा के उप-समूह से वैध सी का उत्पादन करना है जो कोडेजन के लिए समर्थित है। उस ने कहा, सी स्टाइल के समान, MATLAB चर के सामने घोषित करना, कोडर को समझने के लिए कोड को आसान बना सकता है। –

2

मै मैथ्यू गुन के उत्तर से सहमत हूं, यह व्यवहार के लिए कुछ स्पष्टीकरण जोड़ना है। कोडर आपके MATLAB कोड का विश्लेषण कैसे करता है, इस बारे में एक अच्छा मानसिक मॉडल यह है कि यह इसे ऊपर से नीचे तक देखता है।

लागू करना है कि मानसिक मॉडल, अपने पहले दो उदाहरण में, कार्य जो y के आकार का निर्धारण: y = zeros(2,2) और y = zeros(5,5), घटित होने से पहले y का मूल्य कभी प्रयोग किया जाता है। तो कोडर दोनों आकारों को स्वचालित रूप से y एक परिवर्तनीय आकार के सरणी बनाने के लिए विलय कर सकता है। तीसरे उदाहरण में, असाइनमेंट y = zeros(2,2) होता है और फिर y का उपयोग किया जाता है: y = 2 * y। इस बिंदु पर, कोडर को गुणा 2 * y के आकार और प्रकार को निर्धारित करने की आवश्यकता है। केवल 2-by-2 असाइनमेंट देखा जाता है, इसलिए अनुमान लगाया जाता है कि 2 * y को 2-by-2 मैट्रिक्स भी वापस करना होगा।

इस निष्कर्ष प्रदर्शन तो इस धारणा को एम्बेड करता है कि y कोड में 2-by-2 है और अनिवार्य रूप से y का आकार इतना है कि एक 5-by-5 मैट्रिक्स के साथ y के बाद काम असफल चाहिए अवरोधित करता है।

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