পৃথকযোগ্য পূর্ণসংখ্যার 2 ডি ফিল্টার সহগকে পচন করার দ্রুত / দক্ষ উপায়


21

আমি দ্রুত নির্ধারণ করতে চাই যে পূর্ণসংখ্যা সহগের প্রদত্ত 2D কার্নেলটি পূর্ণসংখ্য সহগের সাথে দুটি 2 ডি কর্নেলের মধ্যে পৃথকযোগ্য কিনা। যেমন

 2   3   2
 4   6   4
 2   3   2

মধ্যে বিভক্ত হয়

 2   3   2

এবং

 1
 2
 1

পৃথকীকরণের জন্য আসল পরীক্ষাটি পূর্ণসংখ্যার গাণিতিক ব্যবহার করে মোটামুটি সহজবোধ্য বলে মনে হয়, তবে পূর্ণসংখ্যার সহগ সহ 1 ডি ফিল্টারগুলিতে পচন আরও বেশি সমস্যা হিসাবে প্রমাণিত হচ্ছে। অসুবিধাটি এই সত্যটিতে দেখা যায় যে সারি বা কলামগুলির মধ্যে অনুপাতটি অ-পূর্ণসংখ্যক (যুক্তিযুক্ত ভগ্নাংশ) হতে পারে, যেমন উপরের উদাহরণে আমাদের 2, 1/2, 3/2 এবং 2/3 এর অনুপাত রয়েছে।

আমি সত্যিই এসভিডির মতো ভারী শুল্ক পদ্ধতির ব্যবহার করতে চাই না কারণ (ক) এটি আমার প্রয়োজনের তুলনায় তুলনামূলকভাবে ব্যয়বহুল এবং (খ) এটি এখনও পূর্ণসংখ্য সহগগুলি নির্ধারণে প্রয়োজনীয়ভাবে সহায়তা করে না ।

কোন ধারনা ?


আরো তথ্য

গুণাগুণগুলি ধনাত্মক, নেতিবাচক বা শূন্য হতে পারে এবং এমন রোগগত ঘটনাও ঘটতে পারে যেখানে উভয় 1 ডি ভেক্টরের যোগফল শূন্য হয়, যেমন

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

মধ্যে বিভক্ত হয়

 1  -2   1

এবং

-1
 0
 1

1
আমার মনে আছে কলেজে ফিরে এটি বের করার চেষ্টা করা হয়েছিল। আমি প্রায় সাফল্য পেয়েছি, তবে কীভাবে তা আমার মনে নেই। =) আপনি এটি উল্লেখ করেছেন এখন আমি এটি সম্পর্কে চিন্তাভাবনা থামাতে পারি না!
ফোনন

@ ফোনন: হি - ভাল করে ভাবতে থাকুন - আমি এই বিষয়ে কিছুটা অনুপ্রেরণা ব্যবহার করতে পারি ;-)
পল আর

ডাবল বা ভাসমান মানের জন্য একই জিনিসটি করা কি সম্ভব?
দিয়েগো কাতালানো

@ ডিগো গুগলানো: নীচে ডেনিসের উত্তর দেখুন, এবং যে প্রশ্নটি তিনি math.stackex بدل.com এ সংযুক্ত করেছেন - আমি মনে করি যে ভাসমান পয়েন্ট সহগের আরও সাধারণ ক্ষেত্রে কাজ করতে পারে।
পল আর

@ পলআর, ইমেইলে কীভাবে আপনার সাথে যোগাযোগ করা যেতে পারে? ধন্যবাদ.
রয়ি

উত্তর:


11

আমি @Phononএর উত্তর নিয়েছি এবং এটিকে কিছুটা সংশোধন করেছি যাতে এটি সারি / কলামের অঙ্কের পরিবর্তে কেবল উপরের সারি এবং বাম কলামে জিসিডি পদ্ধতির ব্যবহার করে। এটি প্যাথলজিকাল কেসগুলি আরও ভালভাবে পরিচালনা করবে বলে মনে হয়। এটি এখনও ব্যর্থ হতে পারে যদি শীর্ষ সারি বা বাম কলামটি সমস্ত শূন্য হয় তবে এই পদ্ধতি প্রয়োগের আগে এই কেসগুলি পরীক্ষা করা যেতে পারে।

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

বুঝেছি! ম্যাটল্যাব কোড পোস্ট করা, আজ রাতের বা কাল একটি ব্যাখ্যা পোস্ট করবে

% 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]। আমি আপনার অ্যালগরিদমটি সংশোধন করার চেষ্টা করতে যাচ্ছি যাতে এটি সহগের নিরঙ্কুশ মানগুলির যোগফল ব্যবহার করে এবং দেখুন কিনা এটি সাহায্য করে। আপনার সাহায্যের জন্য আবার ধন্যবাদ।
পল আর

ওকে - এটা পছন্দ আপনি যদি এখনও GCDs পেতে পারেন এবং ব্যবহার করে স্কেলিং না দেখায় abs(M), অর্থাত্ Sa=abs(M)*ones(N,1); Sb=ones(1,N)*abs(M);এবং তারপর উপরের হিসাবে অবিরত, কিন্তু আমি এখনো কিভাবে লক্ষণ পুনঃস্থাপন দেখতে পায় না Sa, Sbশেষে। আমি একটি প্যাথলজিকাল উদাহরণ যুক্ত করেছি যা উপরের মূল প্রশ্নের মধ্যে সমস্যাটি চিত্রিত করে।
পল আর

আমি মনে করি আমার এখন একটি কার্যনির্বাহী সমাধান আছে - আমি এটি আলাদা উত্তর হিসাবে পোস্ট করেছি, তবে অন্তর্নিহিত ধারণাটির জন্য কৃতিত্ব আপনার কাছে যায়। আবার ধন্যবাদ !
পল আর

7

হতে পারে আমি সমস্যাটিকে তুচ্ছ করছি, তবে মনে হয় আপনি পারতেন:

  • এনএমএকজনএকটিআমিআমি=0,1,...,এন-1
  • >0

    • একটিএকটি0R
    • R
    • Rএকটিএকটি00এক্স
    • একটিএকটি0
  • এক্স

এক্স,এনRমি=এক্সসর্বনিম্নআমি=0এন-1এক্সআমি
  • এক্সএনRমি
    এক্সগুলিএকটি=কেএক্সএনRমি,কে=1,2,...,এম
    কেএম

সর্বাধিক মার্জিত পদ্ধতি নয় এবং সম্ভবত এটির আরও ভাল উপায় আছে তবে এটি কার্যকর হওয়া উচিত, এটি প্রয়োগ করা বেশ সহজ, এবং পরিমিত আকারের ম্যাট্রিকগুলির জন্য তুলনামূলক দ্রুত হওয়া উচিত।


ধন্যবাদ - আমি মনে করি বিশদ বিবরণে ডুবে যাওয়ার আগে আমি সম্ভবত এই দিকের মতো কোনও দিকে যাচ্ছিলাম। এটি আমার কাছে 100% স্পষ্ট নয় যে আপনি সর্বদা এই পদ্ধতিটি ব্যবহার করে কোনও সমাধানে পৌঁছে যাবেন তবে যাইহোক, আমার সম্ভবত এটি কোড করা উচিত এবং কয়েকটি উদাহরণ দিয়ে চেষ্টা করার চেষ্টা করা উচিত। আমার কাছে একটি কুঁচি আছে যা "সেরা" সমাধানটি দেয় তার জন্য এটি সারি-ভিত্তিক এবং কলাম-ভিত্তিক উভয়ই প্রয়োগ করা প্রয়োজন। বিশদটি বিশদ বানানোর জন্য সময় দেওয়ার জন্য ধন্যবাদ - আমি এটিতে ব্যস্ত থাকব এবং এটি কীভাবে কার্যকর হয় তা আপনাকে জানাব।
পল আর

সারিগুলির প্রথম উপাদানগুলির সর্বাধিক সাধারণ বিভাজকটি খুঁজে পেলেন না এবং এটি আপনার ভিত্তি ভেক্টর নির্ধারণ করতে ব্যবহার করতে পারেন?
জিম ক্লে

@ জিমক্লে: হ্যাঁ, কার্যকরভাবে আপনি যদি কার্যকারিতা উপলব্ধ থাকে তবে আপনি শেষে করছেন at
জেসন আর

3

এক্সYz- রএকজন|একজন-এক্সYz- র|
এক্স Y z- র
Yz- রএক্সএক্স Y z- র এক্স Y z- র  ঘুরে

( গণিত.স্ট্যাকেক্সেঞ্জচেজে বিভাজ্য-কনভোলিউশনের আনুমানিক-এ-কনভলিউশন-হিসাবে )


1
অব্যক্ত লিঙ্কগুলি দিয়ে প্রশ্নের উত্তর না দেওয়ার চেষ্টা করুন। আপনার উত্তরে প্রয়োজনীয় বিশদটি ব্যাখ্যা করা এবং লিঙ্কটি কেবল রেফারেন্সের জন্য অন্তর্ভুক্ত করা ভাল; সেই লিঙ্কটি যদি উত্তরটির প্রয়োজনীয় বিবরণগুলি ভেঙে দেয় তবে এখনও আছে।
স্যাম মালুনি

@ স্যামমালোনি: প্রয়োজনীয় কারণ হওয়ার কোনও কারণ আমি দেখতে পাচ্ছি না। লিঙ্কটি সমস্ত কিছু বিস্তারিতভাবে ব্যাখ্যা করে। এটি এখনও প্রশ্নোত্তর অনুসন্ধানে পপ আপ করবে। তাই কেন না?
নরেশ

1
@ নরেশ আমি কেবল এটি উল্লেখ করেছি কারণ স্ট্যাক এক্সচেঞ্জ সাইটের অন্যতম লক্ষ্য হ'ল ভবিষ্যতের রেফারেন্সের জন্য উত্তর দেওয়া প্রশ্নের একটি ভাণ্ডার তৈরি করা। সুতরাং আমি যখন বুঝতে পেরেছি যে এই নির্দিষ্ট লিঙ্কটি অন্য কোনও এসই সাইটের সাথে রয়েছে এবং এটি মোটামুটি নিরাপদ হওয়া উচিত তবে এখনও থেকে বেশ কয়েক বছর ধরে লিঙ্কগুলিতে কাজ না করা একটি সাধারণ সেরা অনুশীলন। উত্তরে এই "দুটি সহজ পদ্ধতির" একটি সাধারণ রূপরেখা দেওয়া নিশ্চিত করে যে লিঙ্কিত প্রশ্নের সাথে কিছু ঘটেছিল তথ্যের পরেও তথ্য ধরে রাখা উচিত As যদিও আমি বলেছি, উত্তরের লিঙ্কগুলির সম্পর্কে সেরা অভ্যাসের বিষয়ে এটি একটি সাধারণ মন্তব্য ছিল
স্যাম মালুনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.