मैं पाइथन से मैटलैब में कुछ कोड का अनुवाद कर रहा हूं, और मुझे एक डिक्शनरी में तत्वों को स्टोर करने के तरीके में अंतर का एहसास हुआ। कोड के दो टुकड़ों की तुलना करते हुए, मुझे उम्मीद है कि कोई मेरी धारणा की पुष्टि कर सकता है:

मैटलैब में जब डिक्शनरी में एक वैल्यू का अनुरोध किया जाता है, तो एक पॉइंटर के बजाय एक कॉपी लौटा दी जाती है। इसलिए, यदि उस मान को संशोधित किया जाता है, तो शब्दकोश में मान अपरिवर्तित रहता है।

पायथन में जब शब्दकोश में एक मूल्य का अनुरोध किया जाता है, तो वस्तु के लिए एक सूचक वापस कर दिया जाता है। इसलिए, यदि उस मान को संशोधित किया जाता है, तो शब्दकोश में मान भी बदल जाता है।

मैटलैब में:

clear all; close all;  clc; 

some_dict_with_struct=containers.Map; 

some_dict_with_struct('a')=struct; 

item = some_dict_with_struct('a'); 

item.attribute = 1; 

disp(item.attribute); % displays "1" 

disp(some_dict_with_struct('a')); % has no fields? 

पायथन में

class A: 

  def __init__(self,a): 

    self.a=a 

    return  

A(4) 

some_dict_with_struct={} 

item = A(4) 

some_dict_with_struct['a'] = item 

print(some_dict_with_struct['a'].a)  # returns "4" 

item.a = 0 

some_dict_with_struct['a'] 

print(some_dict_with_struct['a'].a) # returns "0" 

क्या कोई कृपया मुझे मैटलैब में उपयोग करने के लिए तुलनीय डेटा संरचना निर्धारित करने में मदद कर सकता है जो पाइथन के समान व्यवहार प्राप्त करेगा? और, क्या आप कृपया पुष्टि कर सकते हैं कि व्यवहार के बारे में मेरी धारणा सही है?

धन्यवाद।

1
makansij 16 फरवरी 2021, 20:45
2
"पायथन में जब शब्दकोश में एक मूल्य का अनुरोध किया जाता है, तो वस्तु के लिए एक सूचक वापस कर दिया जाता है।" नहीं, ऐसा नहीं है। पायथन में पॉइंटर्स नहीं हैं। हालांकि, पाइथन में सब कुछ अनिवार्य रूप से संदर्भ अर्थशास्त्र है। हालांकि, कुछ भी आपको एक कंटेनर को लागू करने से रोक नहीं रहा है जो करता है जब आप किसी तत्व तक पहुंचने का प्रयास करते हैं तो एक प्रतिलिपि लौटाते हैं, यह आम तौर पर ऐसा नहीं होता है (लेकिन फिर से, आप ऐसी चीज स्वयं बना सकते हैं )
 – 
juanpa.arrivillaga
16 फरवरी 2021, 21:14
धन्यवाद, @juanpa.arrivillaga। मैं समझता हूं कि मैंने "सूचक" शब्द का प्रयोग शायद गलत तरीके से किया है। हालाँकि, आपके संदेश से मुझे ऐसा लगता है कि आप एक प्रति वापस करने के लिए पायथन कोड को संशोधित करने का सुझाव दे रहे हैं। इसके बजाय, मैं जो करने की कोशिश कर रहा हूं वह पाइथन की नकल करने के लिए मैटलैब कोड को संशोधित करना है। क्या आप एक आसान तरीका जानते हैं? या शायद containers.Map के बजाय उपयोग करने के लिए एक आसान डेटा संरचना? धन्यवाद।
 – 
makansij
17 फरवरी 2021, 05:04
2
MATLAB में संदर्भ द्वारा पारित ऑब्जेक्ट प्राप्त करने का एकमात्र तरीका हैंडल क्लासेस का उपयोग करना है . या तो एक अंतर्निहित हैंडल क्लास ऑब्जेक्ट का उपयोग करें, या अपना कस्टम बनाएं।
 – 
Hoki
17 फरवरी 2021, 11:51
धन्यवाद @ होकी! मैंने आपकी टिप्पणी से बहुत कुछ सीखा। कृपया मेरा उत्तर नीचे पढ़ें और मुझे बताएं कि आप क्या सोचते हैं!
 – 
makansij
17 फरवरी 2021, 20:24

1 उत्तर

सबसे बढ़िया उत्तर

समस्या containers.Map के साथ नहीं है, बल्कि इसमें शामिल आइटम के साथ है। struct का उपयोग करने के बजाय, वांछित व्यवहार को हैंडल क्लास में कैप्चर किया जा सकता है।

Item.m नामक एक अलग फ़ाइल में:


%% 

classdef Item < handle 

    properties 

        attribute = 0; 

    end 

end 

इस व्यवहार का निरीक्षण करें:


some_dict_with_struct=containers.Map; 

some_dict_with_struct('a') = Item; 

item = some_dict_with_struct('a'); 

item.attribute = 1; 

disp(item.attribute); % displays "1" 

disp(some_dict_with_struct('a')); % displays "1" 
1
makansij 17 फरवरी 2021, 20:24
1
हां, जो व्यवहार आप चाहते हैं उसे पाने का शायद यह सबसे आसान तरीका है। यदि आपको आवश्यकता हो तो आपकी कक्षा Item को एक संरचना (या एक को शामिल करते हुए) की तरह बनाया जा सकता है। बस एक मामूली नाइटपिक: मुझे पता है कि MATLAB केस संवेदनशील है, item और Item को अलग तरह से व्यवहार किया जाता है, लेकिन आपके उदाहरण में स्पष्टता के लिए मैं उनमें से एक का नाम बदल दूंगा ताकि अंतर किसी के लिए अधिक स्पष्ट हो आपका उत्तर पढ़ना।
 – 
Hoki
18 फरवरी 2021, 12:14