Matlab में मैट्रिक्स के भीतर मूल्य के साथ निकटतम मान बदलने के लिए




loops replace (2)

मैं Matlab के लिए नया हूँ और मेरे पास एक मैट्रिक्स है:

M =[NaN NaN NaN 2010 5454;
    NaN NaN 2009 3000 5000
    NaN 2011 3256 5454 6000
    2009 4000 5666 6545 5555
    5000 5666 6000 7000 8000];

मैं 2010 के मूल्य के साथ नेन के निकटतम मूल्यों को बदलना चाहता हूं। मुझे पता है कि इसे मैन्युअल रूप से कैसे करें और एक-एक करके क्या इन मूल्यों को खोजने के लिए कोई लूप बनाने और उन्हें बदलने के लिए कोई है? परिणाम इस तरह दिखना चाहिए:

M =[NaN NaN NaN 2010 5454;
    NaN NaN 2010 3000 5000
    NaN 2010 3256 5454 6000
    2010 4000 5666 6545 5555
    5000 5666 6000 7000 8000];

पहले ही, आपका बहुत धन्यवाद।


किसी भी स्पष्ट लूप को परिभाषित किए बिना संभव है नीचे चरण और नमूना कोड हैं

  • यह find लिए कि कौन से तत्व NaN find फ़ंक्शन का उपयोग करें
  • फिर, पड़ोसी तत्वों की स्थिति खोजने के लिए सकारात्मक और नकारात्मक दिशा में उन सूचकांकों को 1 के द्वारा ऑफसेट किया जाता है।
  • अंत में उन सभी स्थानों को आवश्यक मान के साथ बदलें, उन स्थितियों को हटाने के बाद जो सरणी के बाहर हैं।

नमूना कोड

% Row and column indices of NaN in array `a`
[x, y] = find(isnan(a));

% All 4-neighbor elements around each NaN
r = [x-1 x+1 x x];
c = [y y y-1 y+1];

% Delete those values that are outside the array bounds
% (For NaNs in the edges)
outInd = r < 1 | r > size(a, 1) | c < 1 | c > size(a, 2);
r(outInd) = [];
c(outInd) = [];

% Replace all these neighbors with required value
a(sub2ind(size(a), r, c)) = 2010;

स्पष्टीकरण और स्पष्ट चर नामों के साथ उत्तर में सुधार के लिए @ क्रेज़ी गेमर के लिए धन्यवाद।

आप एक NaN नजदीक प्रविष्टियों का पता लगाने के लिए 2D-convolution का उपयोग कर सकते हैं; उन प्रविष्टियों में गैर- NaN चयन करें, और वहां वांछित मूल्य लिखें।

निकटता एक पड़ोस द्विआधारी मुखौटा के माध्यम से परिभाषित किया गया है। इसमें आम तौर पर 4 पड़ोसियों (ऊपर, नीचे, बाएं, दाएं) या 8 (विकर्णों सहित) हैं।

कोड को पसंद के अनुसार मुखौटा का उपयोग करने के लिए सामान्यीकृत किया गया है।

उपाय

% Data:
M = [ NaN NaN NaN 2010 5454;
      NaN NaN 2009 3000 5000;
      NaN 2011 3256 5454 6000;
      2009 4000 5666 6545 5555;
      5000 5666 6000 7000 8000 ];

neighbourhood = [0 1 0; 1 0 1; 0 1 0];
% or [1 1 1; 1 0 1; 1 1 1] for 8-neighbours

new_value = 2010;

% Computations:
nanInds = isnan(M);
nanIndsWithNeighs = conv2(nanInds, neighbourhood, 'same')~=0;
neighInds = ~nanInds & nanIndsWithNeighs; % logical AND

M(neighInds) = new_value;