अलग करने योग्य पूर्णांक 2 डी फिल्टर गुणांक को विघटित करने का तेज़ / कुशल तरीका


21

मैं जल्दी से यह निर्धारित करने में सक्षम होना चाहता हूं कि पूर्णांक गुणांक के दिए गए 2 डी कर्नेल पूर्णांक गुणांक वाले दो 1 डी कर्नेल में अलग है या नहीं। उदाहरण के लिए

 2   3   2
 4   6   4
 2   3   2

में वियोज्य है

 2   3   2

तथा

 1
 2
 1

पृथक्करण के लिए वास्तविक परीक्षण पूर्ण रूप से पूर्णांक अंकगणित का उपयोग करते हुए प्रतीत होता है, लेकिन पूर्णांक गुणांक के साथ 1D फिल्टर में अपघटन एक अधिक कठिन समस्या साबित हो रही है। कठिनाई इस तथ्य में निहित है कि पंक्तियों या स्तंभों के बीच अनुपात गैर-पूर्णांक (तर्कसंगत अंश) हो सकते हैं, उदाहरण के लिए उपरोक्त उदाहरण में हमारे पास 2, 1/2, 3/2 और 2/3 के अनुपात हैं।

मैं वास्तव में एसवीडी की तरह एक भारी शुल्क दृष्टिकोण का उपयोग नहीं करना चाहता क्योंकि (ए) यह मेरी आवश्यकताओं के लिए अपेक्षाकृत कम्प्यूटेशनल रूप से महंगा है और (बी) यह अभी भी पूर्णांक गुणांक निर्धारित करने में मदद नहीं करता है।

कोई विचार ?


अग्रिम जानकारी

गुणांक सकारात्मक, नकारात्मक या शून्य हो सकता है, और ऐसे रोग संबंधी मामले हो सकते हैं जहां या तो 1 डी वैक्टर या योग दोनों शून्य हो, जैसे

-1   2  -1
 0   0   0
 1  -2   1

में वियोज्य है

 1  -2   1

तथा

-1
 0
 1

1
मुझे याद है कि मैं कॉलेज में वापस जाने का प्रयास कर रहा था। मैं लगभग सफल हो गया, लेकिन मुझे याद नहीं है कि कैसे। =) मैं अब इसके बारे में सोचना बंद नहीं कर सकता कि आपने इसका उल्लेख किया है!
फोनन

@Ponon: हेह - अच्छी तरह से सोचते रहें - मैं इस पर कुछ प्रेरणा का उपयोग कर सकता हूं। ;-)
पॉल आर

क्या यह एक ही बात करना संभव है लेकिन दोहरे या फ्लोट मूल्यों के लिए?
डिएगो कैटेलानो

@DiegoCatalano: नीचे डेनिस का जवाब देखें, और वह प्रश्न जो वह math.stackexchange.com पर लिंक करता है - मुझे लगता है कि फ्लोटिंग पॉइंट गुणांक के अधिक सामान्य मामले के लिए काम कर सकता है।
पॉल आर

@PaRR, ईमेल पर आपसे कोई कैसे संपर्क कर सकता है? धन्यवाद।
रॉय

जवाबों:


11

मैंने @Phononइसका उत्तर ले लिया है और इसे कुछ हद तक संशोधित कर दिया है ताकि यह पंक्ति / स्तंभ के बजाय केवल शीर्ष पंक्ति और बाएँ स्तंभ पर GCD दृष्टिकोण का उपयोग करे। ऐसा लगता है कि पैथोलॉजिकल मामलों को थोड़ा बेहतर है। यह अभी भी विफल हो सकता है यदि शीर्ष पंक्ति या बाएं स्तंभ सभी शून्य हैं, लेकिन इस विधि को लागू करने से पहले इन मामलों की जांच की जा सकती है।

function [X, Y, valid] = separate(M)    % separate 2D kernel M into X and Y vectors 
  X = M(1, :);                          % init X = top row of M
  Y = M(:, 1);                          % init Y = left column of M
  nx = numel(X);                        % nx = no of columns in M
  ny = numel(Y);                        % ny = no of rows in M
  gx = X(1);                            % gx = GCD of top row
  for i = 2:nx
    gx = gcd(gx, X(i));
  end
  gy = Y(1);                            % gy = GCD of left column
  for i = 2:ny
    gy = gcd(gy, Y(i));
  end
  X = X / gx;                           % scale X by GCD of X
  Y = Y / gy;                           % scale Y by GCD of Y
  scale = M(1, 1) / (X(1) * Y(1));      % calculate scale factor
  X = X * scale;                        % apply scale factor to X
  valid = all(all((M == Y * X)));       % result valid if we get back our original M
end

इसके लिए मूल विचारों के लिए @Phononऔर इसके @Jason Rलिए बहुत धन्यवाद ।


10

समझ गया! MATLAB कोड पोस्ट करना, आज रात या कल एक स्पष्टीकरण पोस्ट करेगा

% Two original arrays
N = 3;
range = 800;
a = round( range*(rand(N,1)-0.5) )
b = round( range*(rand(1,N)-0.5) )

% Create a matrix;
M = a*b;
N = size(M,1);

% Sanity check
disp([num2str(rank(M)) ' <- this should be 1!']);

% Sum across rows and columns
Sa = M * ones(N,1);
Sb = ones(1,N) * M;

% Get rid of zeros
SSa = Sa( Sa~=0 );
SSb = Sb( Sb~=0 );

if isempty(SSa) | isempty(SSb)
    break;
end

% Sizes of array without zeros
Na = numel(SSa);
Nb = numel(SSb);

% Find Greatest Common Divisor of Sa and Sb.
Ga = SSa(1);
Gb = SSb(1);

for l=2:Na
    Ga = gcd(Ga,SSa(l));
end

for l=2:Nb
    Gb = gcd(Gb,SSb(l));
end

%Divide by the greatest common divisor
Sa = Sa / Ga;
Sb = Sb / Gb;

%Scale one of the vectors
MM = Sa * Sb;
Sa = Sa * (MM(1) / M(1));

disp('Two arrays found:')
Sa
Sb
disp('Sa * Sb = ');
Sa*Sb
disp('Original = ');
M

धन्यवाद - यह बहुत अच्छा है - मैं कल रात जाग गया था कि वह गुणांक आदि के बारे में सोच रहा था, लेकिन बस इस तरह जीसीडी का उपयोग करना बहुत अधिक सरल और सुरुचिपूर्ण है। दुर्भाग्य से अभी भी लोहे को बाहर करने के लिए एक शिकन है - इसे सकारात्मक और नकारात्मक गुणांक दोनों के साथ काम करने की आवश्यकता है और इससे पतित मामले बढ़ सकते हैं, जैसे A=[-2 1 0 -1 2]; B=[2 -3 6 0 -1]; M=A'*B;। यहाँ समस्या यह है कि sum(A) = 0ऐसा है Sb = [0 0 0 0 0]। मैं आपके एल्गोरिथ्म को संशोधित करने का प्रयास करने जा रहा हूं ताकि यह गुणांक के पूर्ण मूल्यों का उपयोग करे और देखें कि क्या मदद करता है। आपकी सहायता के लिए एक बार फिर से धन्यवाद।
पॉल आर

ठीक है - ऐसा लगता है कि आप अभी भी जीसीडी प्राप्त कर सकते हैं और इसका उपयोग करके स्केलिंग कर सकते हैं abs(M), अर्थात् Sa=abs(M)*ones(N,1); Sb=ones(1,N)*abs(M);और फिर ऊपर की तरह जारी रख सकते हैं, लेकिन मैं अभी तक नहीं देख सकता कि संकेतों को कैसे पुनर्स्थापित किया जाए Sa, Sbअंत में। मैंने एक पैथोलॉजिकल उदाहरण जोड़ा है जो ऊपर दिए गए मूल प्रश्न में समस्या का चित्रण करता है।
पॉल आर

मुझे लगता है कि मेरे पास अब एक काम करने वाला समाधान है - मैंने इसे एक अलग उत्तर के रूप में पोस्ट किया है, लेकिन अंतर्निहित विचार के लिए इसका श्रेय आपको जाता है। एक बार फिर धन्यवाद !
पॉल आर।

7

हो सकता है मैं समस्या का तुच्छीकरण कर रहा हूँ, लेकिन ऐसा लगता है कि आप कर सकते हैं:

  • एमNMAaii=0,1,,N1
  • j>0

    • aja0jrj
    • rj
    • rjaja0j0x
    • aja0
  • x

xk,norm=xkmini=0N1xi
  • ऐसा करने के बाद, सामान्यीकृत सूची उस पंक्ति के लिए 1 का मान होगा जिसमें सबसे छोटा मानदंड है। आप यह देखना चाहते हैं कि क्या आप किसी पूर्णांक गुणांक वाले सूची को प्राप्त करने के लिए इस सूची को किसी तरह से स्केल कर सकते हैं। एक जानवर-बल दृष्टिकोण बस एक रैखिक खोज कर सकता है, वह है: गणना करें: प्रत्येक मान के लिए प्रत्येक मान। , अनुपात की स्केल की गई सूची की गणना करने के बाद, आपको यह देखने के लिए प्रत्येक की जांच करनी होगी कि क्या वे पूर्णांक-मूल्यवान हैं (फिर से, कुछ सहिष्णुता के साथ)। को सबसे बड़े हर के बराबर सेट करें जिसे आप अंतर-पंक्ति अनुपात में देखने के लिए तैयार हैं। x s c a l e d =K x n o r m ,K=1,2,,MKMxnorm
    xscaled=Kxnorm,K=1,2,,M
    KM

सबसे सुंदर तरीका नहीं है, और यह संभावना है कि एक बेहतर तरीका है, लेकिन यह काम करना चाहिए, इसे लागू करने के लिए बहुत सरल है, और मामूली आकार के मेट्रिसेस के लिए अपेक्षाकृत तेज़ होना चाहिए।


धन्यवाद - मुझे लगता है कि मैं शायद इस दिशा में कुछ आगे बढ़ रहा था, इससे पहले कि मैं विवरणों में फंस गया। यह मेरे लिए 100% स्पष्ट नहीं है कि आप हमेशा इस पद्धति का उपयोग करके एक समाधान पर पहुंचेंगे, लेकिन वैसे भी, मुझे संभवतः इसे कोड करना चाहिए और कुछ उदाहरणों के साथ प्रयास करना चाहिए। मेरे पास एक कूबड़ है कि इसे देखने के लिए पंक्ति-वार और कॉलम-वार दोनों को लागू करना पड़ सकता है, जो "सर्वश्रेष्ठ" समाधान देता है। विवरण निकालने के लिए समय निकालने के लिए धन्यवाद - मैं इसके साथ व्यस्त हो जाऊंगा और आपको बता दूंगा कि यह कैसे काम करता है।
पॉल आर।

क्या आप पंक्तियों के पहले तत्वों के सबसे बड़े सामान्य भाजक नहीं खोज पाए, और अपने आधार वेक्टर को निर्धारित करने के लिए इसका उपयोग कर सकते हैं?
जिम क्ले

@JimClay: हां, यह प्रभावी रूप से वही है जो आप अंत में कर रहे हैं, यदि आपके पास वह कार्यक्षमता उपलब्ध है।
जेसन आर

3

दूसरा तरीका यह है कि अपने कर्नेल एक अलग-अलग सन्निकटन , और देखें कि यह कितना करीब है। ऐसा करने के दो तरीके हैं, यानी छोटा करने के लिए : 1) brute-force ऑप्टिमाइज़ ; यह निश्चित और लिए समय ~ राशि, उत्पाद नहीं, उनकी लंबाई 2) लेता है , इष्टतम सिर्फ एक प्रक्षेपण है, इसलिए बदले में का अनुकूलन करें ।| एक - एक्स y z | एक्स वाई जेड y z एक्स एक्स वाई जेड x y z xyzA|Axyz|
x y z
yzxx y z x y z ...

( Math.stexexbhange पर अनुमानित-ए- कन्वेंशन -ए-ए-सम-ऑफ--से-से-से-अलग होने योग्य-से ।)


1
अस्पष्टीकृत लिंक वाले प्रश्नों का उत्तर न देने का प्रयास करें। अपने उत्तर में आवश्यक विवरणों को स्पष्ट करना और केवल संदर्भ के लिए लिंक को शामिल करना बेहतर है; इस तरह यदि लिंक उत्तर के आवश्यक विवरणों को तोड़ता है, तो अभी भी हैं।
सैम मालनी

@SMMoney: मुझे कोई कारण नहीं दिखता कि यह क्यों जरूरी है। लिंक सब कुछ विस्तार से बताता है। यह अभी भी प्रश्नोत्तर खोज में पॉप अप करेगा। तो क्यों नहीं?
नरेश

1
@ नरेश मैं केवल इसका उल्लेख करता हूं क्योंकि स्टैक एक्सचेंज साइटों के लक्ष्यों में से एक भविष्य के संदर्भ के लिए उत्तरित प्रश्नों का भंडार बनाना है। इसलिए जब मैं समझता हूं कि यह विशेष लिंक किसी अन्य एसई साइट पर है और यह काफी सुरक्षित होना चाहिए, यह एक सामान्य सर्वोत्तम अभ्यास है जो अभी से कई वर्षों से काम कर रहे लिंक पर भरोसा नहीं करता है। जवाब में इन "दो आसान तरीकों 'की एक सामान्य रूपरेखा देने से यह सुनिश्चित होगा कि जानकारी को बनाए रखा जाए भले ही लिंक किए गए प्रश्न के साथ कुछ हो। जैसा कि मैंने कहा, हालांकि, यह उत्तर में लिंक के बारे में सर्वोत्तम प्रथाओं पर एक सामान्य टिप्पणी का अधिक था।
सैम मैलोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.