2017-12-07 25 views
5

मैं किसी दिए गए सरणी से, सरणी में प्रत्येक संभव जोड़े के तत्वों को स्वैप करके प्राप्त सभी सरणी उत्पन्न करने के लिए मूल रूप से $ \ frac {n \ cdot (n-1)} {2} $ चाहता हूं। इसे बनाने का सबसे आसान तरीका क्या है?सरणी में दो तत्वों के सभी क्रमपरिवर्तन कैसे उत्पन्न करें?

[संपादित करें]: उदाहरण के लिए, अगर मैं [1 2 3 4] सरणी है, मैं उत्पन्न करने के लिए होगा [1 3 2 4], [1 2 4 3], [1 4 3 2], [2 1 3 4], [3 2 1 4] और [4 2 3 1]

उत्तर

5

आप इस का उपयोग कर सकते हैं:

x = [10 20 30 40]; % example input array 
t = nchoosek(1:numel(x),2); % each row defines a swapping of two elements 
ind = bsxfun(@plus, (1:size(t,1)).', (t-1)*size(t,1)); % convert to linear index 
result = repmat(x, size(t,1), 1); % initiallize result as copies of the input 
result(ind) = result(fliplr(ind)); % do the swapping in each row 

इस में उदाहरण,

result = 
    20 10 30 40 
    30 20 10 40 
    40 20 30 10 
    10 30 20 40 
    10 40 30 20 
    10 20 40 30 

पुनर्विक्रय की प्रत्येक पंक्ति टी में 2 तत्वों के साथ इनपुट शामिल है। Swappings lexicographical आदेश में किया जाता है। तो पहली पंक्ति तत्व 1 और 2 में बदल दिया गया है; दूसरी पंक्ति तत्व 1 और 3 में बदल दिया गया है; ...; अंतिम पंक्ति तत्व 3 और 4 में बदल दिया गया है।

+0

धन्यवाद, मैं आपको भरोसा करता हूं और एएसएपी का परीक्षण करूंगा। क्या मुझे "विशेष" पैकेज की आवश्यकता है क्योंकि मैं छात्र संस्करण का उपयोग कर रहा हूं? – MysteryGuy

+1

@MysteryGuy नहीं, यह किसी भी टूलबॉक्स का उपयोग नहीं करता –

+0

ठीक है! जैसे ही मैं परीक्षण करता हूं, मैं स्वीकार करूंगा – MysteryGuy

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