मेरे पास आकार (एच, डब्ल्यू) का मैट्रिक्स है, और मुझे मैट्रिक्स के सभी विकर्ण पड़ोसियों के साथ 2xP आउटपुट की आवश्यकता है, यानी प्रत्येक (i, j) जोड़ी के लिए [(i, j); (i-1,j-1)] और [(i, j); (i-1,j+1)] जोड़े (केवल 2 जोड़े, 4 नहीं, क्योंकि मुझे डुप्लिकेट किए गए पड़ोसी जोड़े की आवश्यकता नहीं है)।

मैट्रिक्स का प्रत्येक तत्व मैट्रिक्स में सिर्फ इसकी अनुक्रमणिका है।

मैंने इसे पाशविक बल की कोशिश की (केवल उन बिंदुओं के लिए प्रयास किया जिनके लिए दोनों पड़ोसी इस तरह मौजूद हैं):

coord = reshape(1:w*h, h, w);
pairs = [];
for i=2:h-1
    for j=2:w-1
        pairs = [pairs [coord(i,j) coord(i, j); coord(i-1,j-1) coord(i-1, j+1)]];
    end
end

लेकिन यह बहुत धीमा है। मैटलैब में इस कोड को फिर से लिखने का स्मार्ट और तेज़ तरीका क्या है? अधिमानतः, उन मामलों सहित जब ऐसे पड़ोसियों में से केवल एक मौजूद है (उदाहरण के लिए दूसरी पंक्ति और अंतिम कॉलम: केवल शीर्ष-बाएं पड़ोसी मौजूद है लेकिन शीर्ष-दाएं नहीं)।

एच = डब्ल्यू = 10 के लिए यह कोड मुझे 128 जोड़े देता है (सही, मुझे आशा है)।

2
Valeria 5 पद 2019, 22:25
pairs को प्रीआलोकेट करने से निश्चित रूप से मदद मिलेगी: de.mathworks.com/ help/matlab/matlab_prog/… आकार के बारे में पहले से ही पता चल जाता है।
 – 
Daniel
5 पद 2019, 22:49
धन्यवाद, इसने वास्तव में मदद की। मैंने सुना है कि preallocating मदद करता है लेकिन वास्तव में यह नहीं पता था कि कितना।
 – 
Valeria
5 पद 2019, 22:51

2 जवाब

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

पहले से ही उल्लिखित प्रचार के अलावा, यहां आपके एल्गोरिदम का एक छोटा बदलाव है जो आप चाहते हैं:

w=4
h=5
coord = reshape(1:w*h, h, w);
pairs = [];
k=1;
pairs=nan(2,(w-1*h-1))
for i=1:h-1
    for j=1:w-1
        pairs(:,k:k+1)=[coord(i+1,j+1) coord(i+1, j); coord(i,j) coord(i, j+1)];
        k=k+2;
    end
end

आपका विचार किसी दिए गए तत्व (coord(i,j)) के लिए पड़ोसियों को सम्मिलित करना था। एक छोटा बदलाव और अब आपके पास कोने के मामले नहीं हैं। दो पड़ोसी संबंध डालें जो चार तत्वों के वर्ग के भीतर हैं।

1
Daniel 6 पद 2019, 09:47

आप अपने कोड को वेक्टरकृत कर सकते हैं।

निम्न कोड आपके लूप इंडेक्स के लिए लेता है और प्रत्येक को अलग मैट्रिक्स में रखता है:

A = (coord(2:end-1, 2:end-1))'; %coord(i,j)
B = A;                          %coord(i,j)
C = (coord(1:end-2, 1:end-2))'; %coord(i-1,j-1)
D = (coord(1:end-2, 3:end))';   %coord(i-1,j+1)

निम्नलिखित भाग वांछित प्रारूप में डेटा को आपस में जोड़ते हैं:

P = zeros(2, (w-2)*(h-2)*2);
P(1, 1:2:end) = A(:);
P(1, 2:2:end) = B(:);
P(2, 1:2:end) = C(:);
P(2, 2:2:end) = D(:);

यहां एक पूर्ण कामकाजी (परीक्षण) कोड नमूना है:

h = 10;
w = 10;

coord = reshape(1:w*h, h, w);

%Original loop (kept for testing).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
pairs = [];
for i=2:h-1
    for j=2:w-1
        pairs = [pairs [coord(i,j) coord(i, j); coord(i-1,j-1) coord(i-1, j+1)]];
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

A = (coord(2:end-1, 2:end-1))'; %coord(i,j)
B = A;                          %coord(i,j)
C = (coord(1:end-2, 1:end-2))'; %coord(i-1,j-1)
D = (coord(1:end-2, 3:end))';   %coord(i-1,j+1)

P = zeros(2, (w-2)*(h-2)*2);
P(1, 1:2:end) = A(:);
P(1, 2:2:end) = B(:);
P(2, 1:2:end) = C(:);
P(2, 2:2:end) = D(:);

%Verify result is the same:  
isequal(P, pairs)

यहाँ एक अधिक कॉम्पैक्ट समाधान है:

P = zeros(2, (w-2)*(h-2)*2);
P(1, 1:2:end) = reshape(coord(2:end-1, 2:end-1)', 1, (w-2)*(h-2));    %coord(i,j)
P(1, 2:2:end) = P(1, 1:2:end);                                        %coord(i,j)
P(2, 1:2:end) = reshape((coord(1:end-2, 1:end-2))', 1, (w-2)*(h-2));  %coord(i-1,j-1)
P(2, 2:2:end) = reshape((coord(1:end-2, 3:end))', 1, (w-2)*(h-2));    %coord(i-1,j+1)
0
Rotem 5 पद 2019, 23:22