คำถามติดแท็ก c

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

17
มีตัวแก้ปัญหาการเขียนโปรแกรมแบบไม่เชิงเส้นคุณภาพสูงสำหรับ Python หรือไม่?
ฉันมีปัญหาการเพิ่มประสิทธิภาพทั่วโลกที่ไม่ท้าทายเพื่อแก้ปัญหา ปัจจุบันผมใช้กล่องเครื่องมือเพิ่มประสิทธิภาพของ MATLAB (โดยเฉพาะfmincon()กับอัลกอริทึม = 'sqp') ซึ่งมีประสิทธิภาพมาก อย่างไรก็ตามรหัสของฉันส่วนใหญ่อยู่ใน Python และฉันก็ชอบที่จะเพิ่มประสิทธิภาพใน Python ด้วยเช่นกัน มีตัวแก้ NLP ที่มีการผูก Python ที่สามารถแข่งขันได้fmincon()หรือไม่ มันจะต้อง สามารถรับมือกับความไม่เสมอภาคและความไม่เท่าเทียมกันได้ ไม่ต้องการให้ผู้ใช้จัดหายาโคบ ไม่เป็นไรหากไม่รับประกันว่าจะมีประสิทธิภาพระดับโลก ( fmincon()ไม่) fmincon()ฉันกำลังมองหาบางสิ่งบางอย่างที่ทนทานลู่ไปยังท้องถิ่นที่เหมาะสมแม้สำหรับความท้าทายปัญหาและแม้ว่ามันจะช้ากว่าเล็กน้อย ฉันได้พยายามแก้หลายที่ให้บริการผ่าน OpenOpt และพบว่าพวกเขาจะด้อยกว่าของ fmincon/sqpMATLAB เพียงเพื่อเน้นฉันมีสูตรเวิ้งว้างและแก้ปัญหาที่ดี เป้าหมายของฉันคือการเปลี่ยนภาษาเพื่อให้เวิร์กโฟลว์มีความคล่องตัวมากขึ้น เจฟฟ์ชี้ให้เห็นว่าคุณลักษณะบางอย่างของปัญหาอาจเกี่ยวข้องกัน พวกเขาคือ: 10-400 ตัวแปรการตัดสินใจ 4-100 ข้อ จำกัด ความเท่าเทียมกันของพหุนาม (ดีกรีพหุนามมีช่วงตั้งแต่ 1 ถึงประมาณ 8) จำนวนข้อ จำกัด ของความไม่เท่าเทียมกันที่มีเหตุผลเท่ากับจำนวนตัวแปรการตัดสินใจประมาณสองเท่า ฟังก์ชั่นวัตถุประสงค์เป็นหนึ่งในตัวแปรการตัดสินใจ ชาวจาโคเบียนแห่งข้อ จำกัด ความเท่าเทียมมีความหนาแน่นสูงเช่นเดียวกับชาวจาโคเบียนแห่งข้อ จำกัด …

6
คอมไพเลอร์ของ Fortran นั้นดีกว่าจริง ๆ
คำถามนี้เป็นส่วนขยายของการสนทนาสองครั้งที่เกิดขึ้นเมื่อเร็ว ๆ นี้ในการตอบกลับไปยัง " C ++ vs Fortran สำหรับ HPC " และมันเป็นความท้าทายมากกว่าคำถาม ... หนึ่งในข้อโต้แย้งที่ได้ยินบ่อยที่สุดในความโปรดปรานของ Fortran คือคอมไพเลอร์ดีกว่า เนื่องจากคอมไพล์เลอร์ C / Fortran ส่วนใหญ่ใช้แบ็คเอนด์เดียวกันรหัสที่สร้างขึ้นสำหรับโปรแกรมที่เทียบเท่ากันทางความหมายในทั้งสองภาษาจึงควรเหมือนกัน เราอาจโต้แย้งได้ว่า C / Fortran นั้นคอมไพเลอร์เพื่อเพิ่มประสิทธิภาพมากขึ้น / น้อยลง ดังนั้นฉันจึงตัดสินใจลองทดสอบง่ายๆ: ฉันได้รับสำเนาของdaxpy.fและdaxpy.cและรวบรวมพวกเขาด้วย gfortran / gcc ตอนนี้ daxpy.c เป็นเพียงการแปล f2c ของ daxpy.f (โค้ดที่สร้างขึ้นโดยอัตโนมัติน่าเกลียดเหมือน heck) ดังนั้นฉันจึงเอาโค้ดนั้นและทำความสะอาดมันเล็กน้อย (พบ daxpy_c) ซึ่งโดยทั่วไปหมายถึงการเขียนลูปด้านในสุดเป็น for ( i = 0 …
74 fortran  c  blas  benchmarking 

17
เป็นเรื่องปกติที่จะไม่ใช้ไลบรารีสำหรับอัลกอริธึมเชิงตัวเลขมาตรฐานและทำไม
จำนวนมากของขั้นตอนวิธีเชิงตัวเลข (บูรณาการความแตกต่างของการแก้ไขฟังก์ชั่นพิเศษอื่น ๆ ) ที่มีอยู่ในห้องสมุดการคำนวณทางวิทยาศาสตร์เช่นGSL แต่ฉันมักจะเห็นรหัสด้วยการใช้งาน "มือรีด" ของฟังก์ชั่นเหล่านี้ สำหรับโปรแกรมขนาดเล็กที่ไม่ได้มีไว้สำหรับการเผยแพร่สู่สาธารณะเป็นเรื่องธรรมดาในหมู่นักวิทยาศาสตร์ด้านการคำนวณที่จะใช้อัลกอริธึมเชิงตัวเลขด้วยตัวคุณเอง (ซึ่งฉันหมายถึงการคัดลอกหรือถอดความจากเว็บไซต์ ถ้าเป็นเช่นนั้นมีเหตุผลพิเศษไหมที่จะหลีกเลี่ยงการเชื่อมโยงกับบางสิ่งบางอย่างเช่น GSL หรือเป็น "ประเพณี" มากกว่าสิ่งอื่นใดอีกหรือไม่ ฉันถามเพราะฉันเป็นแฟนตัวยงของการใช้รหัสซ้ำซึ่งจะแนะนำว่าฉันควรพยายามใช้การใช้งานที่มีอยู่เมื่อเป็นไปได้ แต่ฉันสงสัยว่ามีเหตุผลที่หลักการมีประโยชน์น้อยกว่าในการคำนวณทางวิทยาศาสตร์มากกว่าในการเขียนโปรแกรมทั่วไปหรือไม่ ลืมพูดถึง: ฉันถามเฉพาะเกี่ยวกับ C และ C ++ ตรงข้ามกับภาษาเช่น Python ที่มีประโยชน์ชัดเจน (ความเร็วของการดำเนินการ) เพื่อใช้ห้องสมุด
54 libraries  c 

8
วิเคราะห์ข้อมูลโครงสร้างโปรตีนใน C
พื้นหลังของฉันอยู่ในฟังก์ชั่นจีโนม แต่เมื่อเร็ว ๆ นี้ฉันได้ทำงานกับปัญหาที่เกี่ยวข้องกับโครงสร้างโปรตีน ฉันเขียนโปรแกรมที่เกี่ยวข้องใน C สร้างตัวแยกวิเคราะห์ไฟล์ PDB ของตัวเองตั้งแต่เริ่มต้น ฉันไม่ต้องกังวลกับการแยกวิเคราะห์ที่แข็งแกร่งจริง ๆ ฉันเพิ่งรู้ว่าการสร้างตัวเองจะเป็นวิธีที่ดีที่สุดในการบังคับตัวเองให้เข้าใจรูปแบบ PDB ตอนนี้ฉันได้ผ่านขั้นตอนนี้แล้วฉันกำลังมองหาบางสิ่งที่แข็งแกร่งและเป็นผู้ใหญ่มากกว่านี้ มีไลบรารีโครงสร้างโปรตีนโอเพนซอร์ซที่ถูกใช้งานใน C หรือไม่? ฉันสามารถค้นหาบางอย่างบน Google แต่ฉันไม่เคยได้ยินเกี่ยวกับพวกเขามาก่อนและดูเหมือนว่าพวกเขาจะไม่โตเต็มที่หรือมั่นคง คำถามที่เกี่ยวข้องเล็กน้อย: ทุกคนกำลังทำการคำนวณประเภทนี้ทั้งหมดโดยใช้ Python หรือไม่? หรือรหัส homebrew? PS ฉันกำลังมองหาไลบรารี่ที่มีตัวแยกวิเคราะห์ไฟล์ PDB, ฟังก์ชั่นสำหรับการคำนวณมุมบอนด์, ความยาวบอนด์, มุมแรงบิด, พื้นที่ผิวที่สามารถเข้าถึงพื้นผิวได้ ฯลฯ

3
I / O กลยุทธ์สำหรับปัญหาการคำนวณกับชุดข้อมูลขนาดใหญ่?
กลุ่มวิจัยของฉันมุ่งเน้นไปที่การเปลี่ยนแปลงระดับโมเลกุลซึ่งสามารถสร้างข้อมูลกิกะไบต์ได้เป็นส่วนหนึ่งของวิถีเดียวซึ่งจะต้องวิเคราะห์ ปัญหาหลายอย่างที่เราเกี่ยวข้องกับความสัมพันธ์ในชุดข้อมูลซึ่งหมายความว่าเราจำเป็นต้องติดตามข้อมูลจำนวนมากในหน่วยความจำและวิเคราะห์พวกเขามากกว่าที่จะใช้วิธีการเรียงลำดับมากขึ้น สิ่งที่ฉันอยากรู้คือกลยุทธ์ที่มีประสิทธิภาพที่สุดในการจัดการ I / O ของชุดข้อมูลขนาดใหญ่เป็นสคริปต์ ปกติแล้วเราจะใช้สคริปต์ที่ใช้ Python เพราะมันทำให้การเข้ารหัสไฟล์ I / O น้อยกว่า C หรือ Fortran แต่เมื่อเรามีบรรทัดที่ต้องประมวลผลเป็นสิบหรือร้อยล้านก็ไม่ชัดเจนว่าวิธีที่ดีที่สุดคืออะไร . เราควรพิจารณาทำส่วนไฟล์อินพุตของรหัสใน C หรือกลยุทธ์อื่นมีประโยชน์มากกว่าหรือไม่ (จะโหลดล่วงหน้าทั้งอาเรย์ลงในหน่วยความจำได้ดีกว่าชุดของการอ่านตามลำดับของ "chunks" (ลำดับเมกะไบต์) หรือไม่ หมายเหตุเพิ่มเติมบางส่วน: เรากำลังมองหาเครื่องมือการเขียนสคริปต์เป็นหลักสำหรับการโพสต์การประมวลผลมากกว่าเครื่องมือ "ออนไลน์" ดังนั้นการใช้ Python D = 16LimΔ t → ∞⟨ ( x ( t + Δ t ) - x ( t ) …
15 python  c  efficiency 

5
คำนวณ
ฟังก์ชั่นมีความแปลกประหลาดที่อยู่ใกล้กับx = 0 ความแปลกประหลาดนั้นสามารถยกได้แม้ว่า: สำหรับx = 1 , หนึ่งควรมีf ( x ) = 1 , เนื่องจาก e x = ∑ k = 0 x kf:x↦(ex−1)/xf:x↦(ex−1)/xf \colon x \mapsto (e^x-1)/xx=0x=0x = 0x=1x=1x = 1ฉ( x ) = 1f(x)=1f(x) = 1 และ (ex-1)/x=∑k=1x k - 1อีx= ∑k = 0xkk !ex=∑k=0xkk! e^x = …
13 c++  c 

4
C ช้ากว่าฟอร์แทรนในการยิงบรรทัดฐานสเปกตรัม (ใช้ gcc, intel และคอมไพเลอร์อื่น ๆ ) หรือไม่
ข้อสรุปที่นี่: คอมไพเลอร์ของ Fortran นั้นดีกว่ามากแค่ไหน? คือ gfortran และ gcc นั้นรวดเร็วสำหรับโค้ดง่าย ๆ ฉันอยากลองอะไรที่ซับซ้อนกว่านี้ ฉันเอาตัวอย่างการยิงบรรทัดฐานสเปกตรัม ฉันก่อนการคำนวณเมทริกซ์ 2 มิติ A (:, :) แล้วคำนวณเกณฑ์ปกติ (วิธีแก้ปัญหานี้ไม่ได้รับอนุญาตในการยิงที่ฉันคิดว่า) ฉันได้ใช้ Fortran และรุ่น C นี่คือรหัส: https://github.com/certik/spectral_norm รุ่น gfortran ที่เร็วที่สุดคือ spectral_norm2.f90 และ spectral_norm6.f90 (อันหนึ่งใช้ matmul ในตัวและ dot_product ของ Fortran อีกตัวหนึ่งใช้ฟังก์ชันทั้งสองนี้ในรหัส - โดยไม่มีความแตกต่างด้านความเร็ว) รหัส C / C ++ ที่เร็วที่สุดที่ฉันสามารถเขียนได้คือ spectral_norm7.cpp การจับเวลาของ git …
13 fortran  c 

1
มีเครื่องมือที่สามารถสร้างส่วนขยายช่วงเวลาของฟังก์ชัน Fortran (หรือ C) โดยการแยกรหัส Fortran (หรือ C) หรือไม่
กรณีศึกษาในวิทยานิพนธ์ระดับปริญญาเอกของฉันกำหนดว่าฉันต้องมีการขยายรูทีนย่อยของ Fortran ในCHEMKIN-II (ขอโทษสำหรับการเชื่อมโยงมันเป็นสิ่งที่ดีที่สุดที่ฉันสามารถหาได้สำหรับแพ็คเกจที่ไม่ได้จัดจำหน่ายโดย Sandia National Laboratory) CHEMKIN-II เป็นแพ็คเกจทางเคมีที่ใช้ในเคมีการเผาไหม้ เนื่องจากเป็นแพ็คเกจมาตรฐานที่ใช้ในการเผาไหม้ฉันจึงไม่สามารถ (หรือมากกว่านั้นไม่ต้องการ) ใช้แพ็คเกจอื่นที่นั่น เพื่อให้ได้ส่วนขยายช่วงเวลาที่ต้องการฉันใช้เครื่องมือที่พัฒนาขึ้นภายในชื่อDAEPACK. ไบนารีเก่าที่ฉันเคยใช้เพื่อสร้างส่วนขยายช่วงเวลาที่ต้องการของรูทีนย่อย CHEMKIN-II ที่ฉันต้องการในระบบปฏิบัติการ 32- บิต (ด้วยเวอร์ชันของ libstdc ที่สอดคล้องกับ gcc 2.95) เมื่อสองสามปีที่แล้ว ล้าสมัยและจะเป็นอุปสรรคอย่างมากในการใช้งาน (เพราะฉันต้องค้นหาซอฟต์แวร์เวอร์ชั่นอื่น ๆ ที่ใช้มา 32 บิต) ซอร์สโค้ดสำหรับแพ็คเกจนี้ก็เป็นกรรมสิทธิ์ แต่เนื่องจากเดิมพัฒนาขึ้นที่ MIT และฉันทำงานที่ MIT ฉันจึงสามารถ (หลังจากใช้ความพยายามอย่างมาก) ในการรับซอร์สโค้ดสำหรับ DAEPACK เมื่อใช้ซอร์สโค้ดที่ฉันมีฉันสามารถรวบรวม DAEPACK รุ่นที่เข้ากันได้กับ Linux เวอร์ชัน 64 บิตและ libstdc รุ่นที่สอดคล้องกับ gcc 4.xx …

2
มีชุดโอเพ่นซอร์สของตัวแก้ ODE สำหรับ C ที่ใช้ชนิด C99 ดั้งเดิมหรือไม่
ฉันใช้GSLเป็นพื้นฐานของการจำลองหลายอย่าง แต่มันค่อนข้างเกินความจริงสำหรับวัตถุประสงค์ของฉันและมันกำหนดประเภทที่ซับซ้อนของตัวเองด้วยเหตุผลดั้งเดิม แทนที่จะเขียนรหัสตัวแก้ Runge-Kutta ODE ของตัวเองซึ่งอาจจะไม่ได้ผลมากนักมีนักแก้ปัญหาโอเพนซอร์ซโอเพนซอร์สที่ใช้ C99 complex ประเภทดั้งเดิมหรือไม่?
12 c  ode 

3
การทดสอบว่าเมทริกซ์ 12x12 สองตัวมีค่าเดียวกัน
12×1212×1212 \times 12QQQdet(Q)=det(12I−Q−J)(1)det(Q)=det(12I−Q−J)(1)\det(Q) = \det(12I-Q-J) \; \; (1)JJJ ฉันกำลังทำสิ่งนี้กับห้องสมุดตัวนิ่มแต่มันกลับช้าไปหน่อย สิ่งที่ฉันต้องทำคือทำล้านล้านเมทริกซ์และปรากฎว่าการคำนวณสองปัจจัยคือคอขวดของโปรแกรมของฉัน ดังนั้นฉันมีสองคำถาม มีเคล็ดลับใดบ้างที่ฉันสามารถใช้เพื่อคำนวณดีเทอร์แนนต์ได้เร็วขึ้นเมื่อฉันรู้ขนาดของมัน? อาจเป็นการขยายตัวที่ยุ่งเหยิงสำหรับเมทริกซ์12×1212×1212 \times12ที่สามารถทำงานได้ในกรณีนี้? มีวิธีอื่นที่มีประสิทธิภาพในการทดสอบความเท่าเทียมกันหรือไม่(1)(1)(1) แก้ไข เพื่อตอบความคิดเห็น ฉันจำเป็นต้องคำนวณกราฟที่ไม่เกี่ยวข้องกับตัวเองที่เชื่อมต่อทั้งหมดGGGของคำสั่ง131313เช่นGGGและG¯¯¯¯G¯\overline{G}มีจำนวนของต้นไม้ทอด แรงจูงใจสำหรับสิ่งนี้สามารถพบได้ในโพสต์mathoverflowนี้ สำหรับเครื่องฉันใช้งานเครื่อง 8 คอร์ 3.4GHh พร้อมกัน แก้ไข ฉันสามารถลดเวลาทำงานที่คาดไว้ได้ถึง 50% โดยการทำโปรแกรม C เพื่อคำนวณปัจจัยเฉพาะของ12×1212×1212 \times 12เมทริกซ์ ข้อเสนอแนะยังคงยินดีต้อนรับ

4
กำลังมองหาลำดับที่ 8 ของ Runge-Kutta ใน C / C ++
ฉันต้องการใช้วิธีการสั่งซื้อลำดับที่ 8 ของ Runge-Kutta (89) ในแอปพลิเคชันกลศาสตร์ท้องฟ้า / แอสโตรไดนามิคส์ที่เขียนด้วยภาษา C ++ โดยใช้เครื่อง Windows ดังนั้นฉันจึงสงสัยว่าใครจะรู้ว่ามีไลบรารี / การนำไปใช้ที่ดีซึ่งจัดทำเอกสารและใช้งานได้ฟรี? มันก็โอเคถ้ามันเขียนใน C ตราบใดที่ไม่มีปัญหาในการคอมไพล์ จนถึงตอนนี้ฉันได้พบห้องสมุดนี้ (mymathlib)แล้ว รหัสดูเหมือนว่าใช้ได้ แต่ฉันไม่พบข้อมูลเกี่ยวกับสิทธิ์ใช้งาน คุณสามารถช่วยฉันด้วยการเปิดเผยตัวเลือกที่คุณอาจรู้จักและเหมาะสมกับปัญหาของฉัน แก้ไข: ฉันเห็นว่าไม่มีรหัสแหล่ง C / C ++ มากมายตามที่คาดไว้ ดังนั้นเวอร์ชัน Matlab / Octave ก็ใช้ได้เช่นกัน (ยังต้องใช้งานได้ฟรี)

3
คำแนะนำสำหรับการแก้พีชคณิตเชิงเส้นพีชคณิตเชิงเส้นหนาแน่น / ไม่ติดตั้ง C / C น้ำหนักเบา
การเขียนโปรแกรมส่วนใหญ่ของฉันเป็นรหัสการวิจัยแบบครั้งเดียวใน C สำหรับการใช้งานของฉันเอง ฉันไม่เคยแจกจ่ายรหัสใด ๆ ให้แก่ผู้อื่นนอกเหนือจากผู้ทำงานร่วมกันอย่างใกล้ชิด ฉันได้พัฒนาอัลกอริทึมที่ฉันกำลังตีพิมพ์ในวารสารทางวิทยาศาสตร์ ฉันต้องการที่จะให้รหัสที่มาและบางทีรหัสที่ปฏิบัติการได้ในภาคผนวกออนไลน์ของบทความ เพื่อนร่วมงานขอให้ฉันทำการวางนัยสำหรับอัลกอริทึมที่ต้องการให้ฉันเขียนใน C ++ (แอ๊!) และต้องการให้ฉันแก้ระบบเชิงเส้นหนาแน่นขนาดเล็ก หากฉันประสบความสำเร็จในการรับฐานผู้ใช้สำหรับอัลกอริทึมมันจะเป็นส่วนหนึ่งเนื่องจากแถบรายการเพื่อใช้งานอยู่ในระดับต่ำ (เช่นบนพื้น) ผู้ใช้ที่มีศักยภาพจะไม่ติดตั้งไลบรารี ฯลฯ เพื่อใช้รหัส ฉันต้องการรหัสที่จะยืนอยู่คนเดียวอย่างเต็มที่และไม่มีภาระผูกพันโดยใบอนุญาตใด ๆ เลย ฉันอาจจะเขียนแก้ปัญหาของตัวเองโดยเอาบางอย่างออกจาก Golub และ van Loan แต่ฉันควรใช้ตัวแก้วนิลาที่คนอื่นเขียนไปแล้วถ้ามี ข้อเสนอแนะชื่นชม ขอบคุณ!

3
ฉันจะรู้ได้อย่างไรว่าโค้ดของฉันถูกแปลงเป็น vectorized โดยคอมไพเลอร์?
ดังที่อธิบายโดย Jed Brown คำตอบของต้นทุนการค้นหาและการคำนวณโดยใช้ vectorized vs non-vectorized floating point จะส่งผลให้เกิดโค้ดที่เร็วขึ้น คอมไพเลอร์สมัยใหม่หลายคนอ้างว่าพวกเขาสามารถทำการ vectorization อัตโนมัติได้ ฉันจะกำหนดส่วนของรหัสของฉันให้สำเร็จได้อย่างไร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.