Hafif / kurulum gerektirmeyen C veya C ++ tabanlı yoğun doğrusal cebir çözücü için öneriler


9

Programlamamın çoğu, kendi kullanımım için C'de bir kerelik araştırma kodlarıdır. Yakın işbirlikçiler dışında hiçbir kod dağıtmadım. Bilimsel bir dergide yayınladığım bir algoritma geliştirdim. Makaleye çevrimiçi ek kaynak kodu ve belki de yürütülebilir kodu sağlamak istiyorum. Bir meslektaşım, C ++ (ack!) Yazmamı gerektiren ve küçük yoğun doğrusal sistemleri çözmem gereken algoritmaya genelleme yapmamı istedi. Algoritma için bir kullanıcı tabanı almayı başarırsam, kısmen giriş çubuğunun kullanımı düşük olduğu için (zeminde olduğu gibi) olacaktır. Potansiyel kullanıcılar, kodu kullanmak için kitaplık vb. Yüklemez. Kodun tamamen bağımsız olmasını ve herhangi bir lisansla sınırsız olmasını istiyorum. Golub ve van Loan'dan bir şey alarak kendi çözücümü yazabilirim ama orada başka birinin yazmış olduğu bir vanilya çözücüsünü kullanmayı tercih ederim. Öneriler takdir edildi. Teşekkürler!



Sevgili jep, foruma hoş geldiniz. Sorunuz şuraya
GertVdE

Kütüphane çözücüleri, sağlamlık, verimlilik ve genellik adına karmaşık ve büyük olma eğilimindedir. Sorunlarınız çok küçük ve makul derecede iyi durumdaysa, kendi mini uygulamanızı yazmanızı öneririm.
Stefano M

@GertVdE, bu soruya hızlı yanıt için teşekkürler. "Öneriler ..." sorusuna bağlantı vermekten rahatsızım çünkü hem soru hem de en iyi yanıt, bu gibi durumlarda herhangi bir yardım sağlamak için çok genel. Bunu daha ayrıntılı olarak tartışmak isterseniz, bunu scicomp sohbet odasına götürmenizi tavsiye ederim .
Aron Ahmadia

@AronAhmadia: Bu tartışmaların bazılarını çözüme kavuşturmaya başlamanın tek yolunun hem dile hem de kütüphaneye bağlı olan bir bilişimsel programlama programlama chrestomathy uygulamaya başlamak olduğunu düşünüyorum. Kod açıksa ve yapılandırma sorunları (bir kabuk betiği, Şef veya Kukla kullanılarak) halledilebiliyorsa, yalnızca kod çalıştırılarak ve bir zamanlama ile performansla ilgili tartışmalar halledilebilir (veya somut hale getirilebilir). referans makinesi. Açıklık konusundaki tartışmalar, koda bakarak çözülebilir (veya en azından daha somut hale getirilebilir). Aksi takdirde, aynı argümanları almaya devam edeceğiz.
Geoff Oxberry

Yanıtlar:


7

Lapack arayüzünü ihtiyacınız olan fonksiyona tam olarak kopyalamanızı öneririm, muhtemelen ihtiyacınız var dgesv. Bu şekilde, Lapack'in kurulu olduğu insanlar sadece ona bağlanabilir ve sadece çalışır. Lapack yüklü olmayan kişiler için, bu işlevle ilgili kendi basit uygulamanızı sağlar veya muhtemelen diğerlerinin önerdiği gibi Eigen veya FLENS kullanarak uygularsınız.

Fortran topraklarında, Lapack kütüphanesi öyle bir standarttır ki, çoğu insan kendi uygulamalarını sağlamak yerine onu kullanır ve işte budur.


+1 Çoğu Linux dağıtımının (en azından Debian tabanlı) depoda ikili paketler ve satıcı tarafından sağlanan tüm matematik kütüphanelerinin (MKL, SunPerf, ACML, ESSL vb.) Her zaman olabildiğince standart libs kullanmalısınız, ancak Windows / Mac'te iseniz, onlara ücretsiz bir Fortran derleyici (gfortran) yüklemek biraz C iş ile daha iyi olabilir ya da duydum.
stali

Birçok kez lapack kullandım ama şu anda fortran topraklarında değilim. Kullanıcı tabanımın üzerinde çalıştığı platformların istatistiksel dağılımının büyük ölçüde pencerelere, mac'ların daha küçük bir yüzdesine ve daha da küçük bir * nix yüzdesine benzer olmasını bekliyorum. Windows ile olan deneyimim çok az ve bunu böyle tutmayı tercih ediyorum. Ben tek başına bir C ++ kodu istiyorum nedeni budur. Bazı kullanıcılarımı derlemek ve çalıştırmak için kod alma konusunda yardım sağlamak zorunda kalacağım. Bunu yapmak için gereken işi en aza indirmem gerekiyor.
jep

Kullanıcı tabanınız Windows / Mac ise, basit bir C tabanlı (belki kendi başınıza bile) bir uygulama ile daha iyidir. Kurulması zor veya diğer 5 lib'e bağlı bir paket, özellikle de birinci sınıf ikili paket deposu (Debian gibi) mevcut olmadığında, kullanıcılarınızı uzun süre kapatacaktır. Çoğu Windows / Mac kullanıcısının tek tıklamayla yükleme için kullanıldığını unutmayın. Kullanım kolaylığı, her şeyi zafere taşır.
stali

5

Birçok kişinin bilimsel hesaplama yapmaya başladığında yaptığı çok erken bir hata, tüm kodunuzu aynı dilde yazmanız gerektiğini varsayar. Bence bu, derlenmiş programların aynı derleyicinin bile sürümleri arasında birbirleriyle nasıl iletişim kuracağı net olmadığında, büyük ölçüde tarihsel nedenlerden kaynaklandığını düşünüyorum. Bununla birlikte, bu durumda, yine de C ++ kullanacaksanız, ihtiyaçlarınızı karşılayabilecek çok iyi birkaç C ++ yalnızca başlık şablon kütüphanesi vardır.

Kodunuzu akademik nedenlerle dağıttığınız ve yoğun bir lineer cebir çözücüyü kodunuza gömmek istediğiniz için, Eigen'i düşünmenizi şiddetle tavsiye ederim . Eigen, Mozilla Kamu Lisansı kapsamında lisanslanmıştır ve yalnızca başlıklı bir kütüphanedir. Bu, Eigen'i kodunuzla kaynak formda dağıtabileceğiniz anlamına gelir (bu, kodunuza herhangi bir lisans kısıtlaması getirmez) ve son derece verimli yoğun doğrusal çözücüler de dahil olmak üzere genel özelliklerine erişim elde edeceğiniz anlamına gelir. GertVdE'den bahsedildiği gibi, başka seçenekleriniz de var .


Tek bir dosya bekliyordum. Bir süredir bilimsel programlama yaptım. C ve fortran gibi biraz karışık dillerim var ama bu proje için tüm kaynak kodumu içeren bir dosya istiyorum. Sanırım büyük bir anlaşma olmaz C ++ kodunda bir C çözücü koyabilirsiniz. Temelde kodu olabildiğince basit tutmak istiyorum. Pivotlu LU yeterli olmalıdır. Eigen'e bakacağım. Teşekkürler!
jep

@jep, performans hakkında gerçekten umursamıyorsanız, CLAPACK'ten ihtiyacınız olan rutini seçmeyi de deneyebilirsiniz .
Aron Ahmadia

Tüm bağımlı kodu aynı dilde yazmak için iyi nedenler vardır, özellikle HPC ortamlarında, garip derleyici / bağlantı sorunları ve 32/64-bit arayüz sorunlarınız vardır. Örneğin, yerleşik kitaplıklar için bir tamsayının genişliğini nasıl bilebilirim? Yerleşik bir kütüphane için hangi derleyicinin kullanıldığından nasıl emin olabilirim ve bu derleyiciye buna bağlayabilir miyim? Her şeyin tek bir dilde olması bu sorunların çoğunu basitleştirir. Ve evet, küme koruyucular tarafından sağlanan belgeler olmalıdır, ancak çoğu zaman yoktur.
Victor Liu

@VictorLiu - Bahsettiğiniz sorunlar, uygulamalara dillerden daha sıkı bağlıdır. Yorum alanı ciddi bir tartışmaya girmek için kötü bir yer, ancak bu konudaki düşüncelerimi genişletmemi isterseniz, sizi sohbete veya başka bir yere davet etmekten mutluluk duyuyorum.
Aron Ahmadia

4

Doğrusal denklem sistemleri için güvenilir bir çözümleyici istiyorsanız FLENS'i tavsiye ederim . LAPACK'in tam olarak yeniden uygulanmasını içerir (tek iş parçacıklı bir BLAS uygulaması kullanılıyorsa, LAPACK ile aynı yuvarlaklaştırma hatalarını bile üretir). Bu, tüm FLENS-LAPACK işlevleri için geçerlidir (yardımcı program işlevleriyle birlikte yaklaşık 100 rutin).

FLENS bir BSD Lisansı altındadır ve bu nedenle tescilli ürünlere dahil edilmesine izin verir.

FLENS yalnızca başlıktır ve yalnızca bir FLENS alt kümesine ihtiyacınız varsa, size yalnızca ihtiyacınız olan işlevleri içeren soyulmuş bir sürüm verebilirim. FLENS kendi referans BLAS uygulaması ile birlikte gelir. Ancak isteğe bağlı olarak kullanıcılarınız ATLAS, OpenBLAS veya GotoBALS gibi optimize edilmiş BLAS kitaplıklarına bağlanabilir. Büyük matrisler için bu, Eigen'e kıyasla yaklaşık% 40'lık bir performans kazancı sağlar.

Ve evet, Eigen de sonuçlarını kontrol etmek için LAPACK test paketini kullanıyor. Bunu 3 işlev için yaparlar (Lu, Cholesky ve Özdeğerler / - simetrik bir matrisin vektörleri). Bununla birlikte, simetrik olmayan bir matrisin özdeğer / vektörlerini hesaplamaları LAPACK test takımında başarısız olacaktır.

Feragatname: Evet, FLENS benim bebeğim! Bu yaklaşık% 95 kodladım ve her kod satırı değdi demektir.


1
Michael - Lütfen bunu bağlantıyı açıklama ile ilgili SSS'deki kurala uymanız gerektiğine dair samimi bir uyarı olarak düşünün .
Aron Ahmadia

Tabii, ama 'Eigen olduğunu düşünmenizi şiddetle tavsiye ediyorum' başlıklı yazılarınızı 'örneğin Eigen var' gibi bir şeye yeniden ifade edebilirsiniz. Bu durumda, bu da dahil olmak üzere (hepsi doğru olduğu kanıtlanmış olsa da) Eigen hakkındaki görüşlerimi silerim.
Michael Lehn

1
Eigen hakkındaki düşünceleriniz burada sorun değil (her ne kadar benim için konu dışı görünseler de). FLENS'in birincil geliştiricisisiniz, burada bir cevapta önerecekseniz, projenin geliştiricisi olarak ilişkinizi açıklamalısınız.
Aron Ahmadia

Ah, tamam o zaman. '... verebilirim ...' ile dolaylı olarak net olduğunu düşündüm. Bu formdaki açıklama uygun mu?
Michael Lehn

2
Sadece bunu yaptığınız için teşekkür etmek istiyorum; C ++ 'da Lapack'in büyük bir bölümünü yeniden uygulamak için benzer planlarım vardı. Ancak, gelişmiş (özdeğer) rutinlerin çoğunda, sadece Lapack'e çağrı yapmayı ertelediğiniz anlaşılıyor, bu yüzden her şeyi yeniden uyguladığınızı söylemek biraz yanlış reklam. Öte yandan, ben aslında C ++ için ZGEEV kaynağını taşıdık RNP bazı bölümleri otomatik dönüşüm 1 tabanlı dizin hala olsa.
Victor Liu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.