ความซับซ้อนในการคำนวณของสหสัมพันธ์ในเวลาเทียบกับการคูณในพื้นที่ความถี่


12

ฉันกำลังทำงานกับความสัมพันธ์แบบ 2 มิติสำหรับเทคนิคการประมวลผลภาพ (การจดจำรูปแบบ ฯลฯ ) ฉันสงสัยว่ามีวิธีการทางทฤษฎีเกี่ยวกับวิธีบอกเมื่อใช้การคูณในพื้นที่ความถี่เหนือความสัมพันธ์ในอวกาศ สำหรับขนาดของพื้นที่2 xความถี่นั้นเร็วขึ้นอย่างเห็นได้ชัด แต่ขนาดเล็กเช่น Prime 11 นั้นเป็นอย่างไร

คำตอบ:


10

ฉันจะสมมติว่ามันถูกทำบนซีพียูทั่วไป, หนึ่งคอร์, รันเธรดง่าย ๆ , ไม่มีฮาร์ดแวร์แฟนซี หากมีมากกว่านั้นเกิดขึ้นก็อาจถูกนำมาพิจารณาด้วยการปรับเปลี่ยนเหตุผลสำหรับระบบที่ง่ายขึ้น ไม่สามารถพูดได้อีกมากโดยไม่ต้องใช้ระบบเฉพาะในการพูดคุยหรือทั้งตำราหรือรายงานการวิจัยเพื่อครอบคลุมช่วงของความเป็นไปได้

ฉันไม่ต้องกังวลเกี่ยวกับพลังของสองขนาด มันไม่สำคัญ อัลกอริทึม FFT กับหน่วยผีเสื้อและสิ่งที่มีอยู่สำหรับปัจจัย 3 หรือจำนวนน้อย ๆ ไม่ใช่แค่ 2 มีอัลกอริธึมที่ชาญฉลาดสำหรับชุดข้อมูลขนาดใหญ่เช่นกัน ฉันไม่ชอบการอ้างถึงWikipedia เกี่ยวกับเรื่องนี้เนื่องจากลักษณะที่ไม่เที่ยงแท้

มี FFTs ที่มีความซับซ้อน O (N log N) สำหรับ N ทั้งหมดแม้กระทั่งสำหรับ Prime N

การดําเนินการของ FFTs สำหรับพล N สามารถพบได้ในห้องสมุดจีพีFFTW

วิธีเดียวที่เชื่อถือได้ในแง่ของวิศวกรรมที่ร้ายแรงคือการสร้างและวัด แต่เราสามารถได้แนวคิดจากทฤษฎีเพื่อดูความสัมพันธ์ระหว่างตัวแปร เราต้องการประมาณการจำนวนการดำเนินการทางคณิตศาสตร์ที่เกี่ยวข้องสำหรับแต่ละวิธี

การคูณยังช้ากว่าการเติมซีพียูส่วนใหญ่แม้ว่าความแตกต่างจะหดตัวลงอย่างมากในช่วงหลายปีที่ผ่านมาดังนั้นเราจะนับการคูณ การบัญชีสำหรับการเพิ่มเติมนั้นต้องใช้ความคิดและการติดตามของอีกเล็กน้อย

การบิดตรงไปตรงมาจริง ๆ แล้วคูณและเพิ่มโดยใช้เคอร์เนล convolution ซ้ำสำหรับแต่ละพิกเซลเอาต์พุตต้องการการคูณW²·K²โดยที่ W คือจำนวนพิกเซลทางด้านหนึ่งของภาพ (สมมติว่าสแควร์สำหรับความเรียบง่าย) และ K คือขนาด ของเคอร์เนล convolution เช่นเดียวกับพิกเซลที่อยู่ข้างหนึ่ง ใช้การคูณK²เพื่อคำนวณพิกเซลเอาต์พุตหนึ่งพิกเซลโดยใช้เคอร์เนลและส่วนขนาดเดียวกันของภาพอินพุต ทำซ้ำสำหรับพิกเซลเอาต์พุตทั้งหมดซึ่งมีจำนวนเท่ากับในภาพอินพุต

(N mults ) direct = W²·K²

ในการทำงานในพื้นที่ฟูริเยร์เราจะต้องแปลงฟูริเยร์รูปภาพ สิ่งนี้ทำได้โดยการใช้ FFT กับแต่ละคอลัมน์แยกกันจากนั้นใช้กับแต่ละแถว จุดข้อมูล FFT สำหรับ N ใช้เวลาประมาณ 2N · log (N) การคูณ เราต้องการให้ N เป็น W ความยาวของหนึ่งคอลัมน์หรือแถว ลอการิทึมทั้งหมดที่นี่เป็นฐานสอง

มีแถว W และคอลัมน์ W ดังนั้นหลังจากทำ FFT ทั้งหมดแล้วเราได้ทำการคูณทวีคูณ 2W · (2W · log (W)) สองเท่านั่นเพราะหลังจากที่เราคูณด้วยการแปลงฟูริเยร์ของเคอร์เนลเราต้องผกผัน - ฟูเรียร์ข้อมูลเพื่อกลับสู่ภาพที่เหมาะสม นั่นคือ8W²· log (W) แน่นอนว่าการคูณด้วยการแปลงฟูริเยร์ของเคอร์เนลต้องทำอีกครั้งการคูณW²อีกครั้ง (ทำได้ครั้งเดียวไม่ใช่หนึ่งครั้งต่อพิกเซลเอาต์พุตต่อแถวหรืออะไรก็ตาม) นี่คือการคูณที่ซับซ้อนดังนั้นนั่นคือการคูณจริง4W²

ดังนั้นถ้าฉันทำผิด (และฉันอาจทำ) เรามี

(N mults ) Fourier = 4W²· (2 ·บันทึก (W) + 1)

เมื่อไหร่ที่เราต้องการทำสิ่งที่ทางตรง? เมื่อ K มีขนาดเล็กเพียงพอที่จะทำให้W²·K²มีขนาดเล็กกว่า4W²· (2 · log (W) + 1) ปัจจัยทั่วไปของW²นั้นสามารถแยกออกได้ง่าย เราอาจปล่อย "+1" ได้เนื่องจากเราจัดการกับการประมาณค่าในอุดมคติ +1 น่าจะหายไปจากข้อผิดพลาดที่เกี่ยวข้องกับการใช้งานจริงไม่นับการเพิ่มการวนซ้ำโอเวอร์เฮดและอื่น ๆ ใบที่:

K² < 8·log(W)

นี่เป็นเงื่อนไขโดยประมาณสำหรับการเลือกวิธีเข้าใกล้โดยตรงกับช่องว่างความถี่

โปรดทราบว่าความสัมพันธ์ของภาพขนาดเดียวกันสองภาพนั้นเหมือนกับการสนทนากับเคอร์เนลขนาด K = W. พื้นที่ฟูริเยร์เป็นวิธีที่จะทำเสมอ

สิ่งนี้สามารถปรับปรุงและถกเถียงกันในเรื่องค่าใช้จ่ายการวางท่อของ opcodes ลอยเทียบกับจุดคงที่และโยนออกไปนอกหน้าต่างด้วย GPGPU และฮาร์ดแวร์พิเศษ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.