En yaygın kullanılan C ++ vektör / matris matematik / doğrusal cebir kütüphaneleri ve bunların maliyet ve fayda dengesi nedir? [kapalı]


243

Birçok projenin yavaş yavaş matris matematiği yapma ihtiyacı ortaya çıktığı ve yarım sınıflı bir özel lineer cebir kütüphanesi inşa edene ve ona bağlı olarak yavaşça işlevselliği ekleyen tuzağa düştüğü görülüyor.

Bazı teğetsel ilgili kitaplığa (örneğin OpenCV, OpenSceneGraph) bağımlılık oluşturmadan bunu önlemek istiyorum.

Orada yaygın olarak kullanılan matris matematik / doğrusal cebir kütüphaneleri nelerdir ve neden birini diğerinin üzerinde kullanmaya karar veresiniz ki? Herhangi bir nedenle kullanılmasına karşı önerilecek herhangi bir bilgi var mı? Bunu özellikle geometrik / zaman bağlamında * (2,3,4 Dim) * kullanıyorum, ancak gelecekte daha yüksek boyutlu veriler kullanıyor olabilirim.

API, hız, bellek kullanımı, genişlik / bütünlük, darlık / özgüllük, genişletilebilirlik ve / veya olgunluk / kararlılık ile ilgili farklılıklar arıyorum.

Güncelleme

Sonunda çok mutlu olduğum Eigen3'ü kullandım.


2
OSG ve OpenCV'den bahsettiğinizden beri, 3B ve 4x4 matrisleri gibi 3B grafik tipi vektör / matrislere ihtiyacınız olduğunu tahmin ediyorum. Cevabımı buna dayandım, ancak bunu tam olarak nasıl kullandığınızı belirtmek isteyebilirsiniz - matris çözüme mi ihtiyacınız var? Daha yüksek boyutlu matris matematiği? vs
Reed Copsey

Şu anda sadece 2D geometri tabanlı şeyler yapıyorum, ancak varsayımsal olarak bazen 2D veriler üzerinde 3x3 işlemlere ihtiyacınız var ve 3D verilerin bu nedenle 4x4 işlemlerinin gerekli olup olmadığı belirsiz. Şirket genelinde ortak bir kütüphane kullanmak istiyoruz. Ödünleşmenin ne olacağı konusunda iyi bir fikrim yok. Daha genel daha iyi olurdu, ama soru ne pahasına.
Catskul

1
Sadece geometrik dönüşümler yapıyorsanız, cevabımda belirttiğim gibi gerçekten GGT'ye bakmanızı tavsiye ederim. Bunun için çok eksiksiz, ama gerçekten hiçbir şey yapmıyor AMA, bu yüzden çok temiz ve kolay bir seçenek. BLAS ve LAPACK, geometrik dönüşümler için değil, bilimsel ve matematik için karmaşık karmaşık matris çözümleri (yani: 50x50 matrisler, seyrek matrisler, vb.) İçindir.
Reed Copsey

Yanıtlar:


114

Bunun için Genel Grafik Araç Seti'ne yerleşmiş birkaç proje var . Orada GMTL güzel - oldukça küçük, çok fonksiyonel ve çok güvenilir olacak kadar yaygın olarak kullanılmıştır. OpenSG, VRJuggler ve diğer projelerin hepsi, kendi elle yuvarlanan vertor / matris matematiği yerine bunu kullanmaya başladı.

Oldukça hoş buldum - her şeyi şablonlarla yapıyor, bu yüzden çok esnek ve çok hızlı.


Düzenle:

Yorumlar tartışmasından ve düzenlemelerden sonra, belirli uygulamaların yararları ve dezavantajları ve durumunuz göz önüne alındığında neden birini diğeri seçebileceğiniz hakkında daha fazla bilgi vereceğimi düşündüm.

GMTL -

Faydaları: Özellikle grafik motorları için tasarlanmış basit API. Başka herhangi bir pakette bulunmayan oluşturmaya yönelik birçok ilkel türü (uçaklar, AABB, çoklu enterpolasyonlu quatenrions, vb.) İçerir. Çok düşük bellek yükü, oldukça hızlı, kullanımı kolay.

Dezavantajları: API özellikle oluşturma ve grafiklere çok odaklanmıştır. Genel amaçlı (NxM) matrisler, matris ayrıştırma ve çözme vb. İçermez, çünkü bunlar geleneksel grafik / geometri uygulamaları alanı dışındadır.

Öz -

Faydaları: Temiz API , kullanımı oldukça kolaydır. Kuaterniyonlar ve geometrik dönüşümler içeren bir Geometri modülü içerir . Düşük bellek yükü. Büyük NxN matrislerinin ve diğer genel amaçlı matematiksel rutinlerin tam, yüksek performanslı çözümü.

Dezavantajları: İstediğinizden biraz daha geniş bir kapsam olabilir (?). GMTL ile karşılaştırıldığında daha az geometrik / spesifik rutin oluşturma (örn: Euler açısı tanımları, vb.).

IMSL -

Yararları: Çok eksiksiz bir sayısal kütüphane. Çok, çok hızlı (sözde en hızlı çözücü). Şimdiye kadar en büyük, en eksiksiz matematiksel API. Ticari olarak desteklenen, olgun ve kararlı.

Dezavantajları: Maliyet - ucuz değil. Çok az geometrik / belirli yöntem oluşturma, bu yüzden kendi lineer cebir sınıflarının üstüne kendi rulo gerekir.

NT2 -

Yararları: MATLAB'a alışkınsanız daha tanıdık olan bir sözdizimi sağlar. Büyük matrisler vb. İçin tam ayrışma ve çözme sağlar.

Dezavantajları: Matematiksel, işleme odaklı değil. Muhtemelen Eigen kadar performans göstermez.

LAPACK -

Faydaları: Çok kararlı, kanıtlanmış algoritmalar. Uzun zamandır etrafta. Tam matris çözme, vb. Gizli matematik için birçok seçenek.

Dezavantajları: Bazı durumlarda yüksek performans göstermez. Fortran'dan, kullanım için tek API ile taşındı.

Şahsen benim için, tek bir soruya geliyor - bunu nasıl kullanmayı planlıyorsunuz? Eğer sadece render ve grafiklere odaklanıyorsanız, iyi performans gösterdiğinden ve kendi uygulamanızı uygulamak zorunda kalmadan kutudan birçok yararlı oluşturma işlemini desteklediğinden, Generic Graphics Toolkit'i seviyorum . Genel amaçlı matris çözme işlemine ihtiyacınız varsa (yani: büyük matrislerin SVD veya LU ayrışması), Eigen ile birlikte giderim , çünkü bazı geometrik işlemler sağlar ve büyük matris çözümleri ile çok performans gösterir. Kendi grafiklerinizi / geometrik işlemlerinizi (matrislerinin / vektörlerinin üstüne) daha fazla yazmanız gerekebilir, ancak bu korkunç değildir.


GMTL'ye karar vermeden önce diğer kütüphaneleri değerlendirdiniz mi? Yüzeysel karşılaştırma beni Eigen'in daha iyi desteklendiğine inanıyor, ancak bu ilgili web sitelerini gözden geçirme temelinde. Birinin diğerine göre herhangi bir avantajı olduğunu biliyor musunuz?
Catskul

Eigen de iyi çalışıyor. Araştırmamı yaptığım zamanki kadar olgun değildi, ama bu noktada iyi bir seçenek olacağını düşünüyorum. GMTL oldukça yaygın olarak kullanılmıştır ve kullanmaya karar verdiğimde çok olgun ve sağlamdı.
Reed Copsey

Sanırım sorumu en uç noktaya indirgemek için: Seçiminizi sübjektif olarak "Bu daha iyi görünüyor" veya fark yaratan belirli özellikler (api, hız, bellek kullanımı, genişlik, darlık, genişletilebilirlik) gibi yaptınız mı? Sanırım olgunluk bu kriterlerin altına düşüyor, ancak olgunluk tek metrik olsaydı, BLAS veya LAPACK tabanlı bir seçenek seçeceğinizi düşünüyorum.
Catskul

Birden fazla seçeneği denedikten sonra bunu seçtim ve bunu temel aldım: performans, kullanılabilirlik ve düşük çalışma zamanı / derleme zamanı yükü. Eigen şimdi bu noktada olduğundan çok daha iyi görünüyor, bu yüzden aralarında karar veremiyorum. Ancak GMTL'den yaptığımız kullanımdan dolayı çok mutlu oldum.
Reed Copsey

Bu GMTL'yi neden sevdim ve kullandım. Kullanımı çok doğaldı ve çalışmak çok ama çok kolaydı. Ayrıca, geometrik dönüşüm ve kuaterniyon rotasyonlarını doğrudan idare etmekten endişelendiğim için, bu durumda ihtiyacım olan her şeyi destekledi.
Reed Copsey

38

Bu yüzden oldukça eleştirel biriyim ve bir kütüphaneye yatırım yapacaksam, kendimi neyin içine soktuğumu daha iyi bilirdim. İnceleme sırasında eleştiriye ve yassılığa ışık tutmanın daha iyi olduğunu düşünüyorum; yanlış olan şey gelecek için doğru olandan çok daha fazla sonuç doğurur. Bu yüzden, bana yardımcı olabilecek bir tür cevap sağlamak için buraya biraz fazla gideceğim ve umarım bu yolda ilerleyebilecek başkalarına yardımcı olur. Bunun, bu kitapçıklarla yaptığım küçük incelemelere / testlere dayalı olduğunu unutmayın. Oh ve ben Reed'in bazı olumlu açıklamalarını çaldık.

Eigen2 güvensizliğinin bir dezavantajı çok büyük olduğu için kendine özgü olmasına rağmen GMTL ile gittiğimi belirteceğim. Ancak son zamanlarda Eigen2'nin bir sonraki sürümünün hizalama kodunu kapatacak ve güvenli hale getirecek tanımları içereceğini öğrendim. Böylece geçiş yapabilirim.

Güncelleme : Eigen3'e geçtim. Her ne kadar kendine özgü ifadelerine rağmen, kapsamı ve zarafeti göz ardı etmek çok zordur ve güvensiz hale getiren optimizasyonlar bir tanımla kapatılabilir.

Eigen2 / Eigen3

Faydaları: LGPL MPL2, Temiz, iyi tasarlanmış API, kullanımı oldukça kolaydır. Canlı bir toplulukla iyi korunmuş gibi görünüyor. Düşük bellek yükü. Yüksek performans. Genel lineer cebir için üretilmiştir, ancak iyi geometrik işlevsellik de mevcuttur. Tüm başlık lib, bağlantı gerekmez.

İdiocyncracies / downsides: (Bunların bazıları / hepsi mevcut geliştirme dalı Eigen3'te bulunan bazı tanımlarla önlenebilir )

  • Güvenli olmayan performans optimizasyonları kurallara dikkatle uyulmasına neden olur. Kurallara uyulmaması çökmelere neden olur.
    • güvenli bir şekilde değer katamazsınız
    • Eigen türlerinin üye olarak kullanılması özel ayırıcı özelleştirme gerektirir (veya kilitlenir)
    • stl konteyner türleri ve muhtemelen diğer şablonlar ile kullanın özel ayırma özelleştirme gerekli (ya da çökecek)
    • bazı derleyiciler işlev çağrılarında çökmeleri önlemek için özel dikkat gerektirir (GCC pencereleri)

GMTL

Faydaları: LGPL, Oldukça Basit API, özellikle grafik motorları için tasarlanmıştır. Başka herhangi bir pakette bulunmayan oluşturmaya yönelik birçok ilkel türü (uçaklar, AABB, çoklu enterpolasyonlu quatenrions, vb.) İçerir. Çok düşük bellek yükü, oldukça hızlı, kullanımı kolay. Tüm başlık tabanlı, bağlantı gerekmez.

Idiocyncracies / olumsuzlukları:

  • API ilginç
    • başka bir lib'de myVec.x () işlevi yalnızca myVec [0] aracılığıyla kullanılabilir (Okunabilirlik sorunu)
      • bir dizi veya stl :: nokta vektörü, ilk noktanın x bileşenine erişmek için pointsList [0] [0] gibi bir şey yapmanıza neden olabilir
    • derleme gereksiz temperleri ortadan kaldırdığında naif bir optimizasyon girişiminde, çapraz (vec, vec) kaldırıldı ve makeCross (vec, vec, vec) ile değiştirildi
    • Normal matematik işlemleri, bazı optimizasyon özelliklerini kapatmazsanız normal türleri döndürmez. Örneğin: vec1 - vec2normal bir vektör döndürmez, bu yüzden çalışır length( vecA - vecB )olsa bile başarısız olur vecC = vecA - vecB. Şunun gibi sarmalısınız:length( Vec( vecA - vecB ) )
    • vektörler üzerindeki işlemler üyelerden ziyade harici fonksiyonlar tarafından sağlanır. Bu, yaygın sembol adları çarpışabileceği için kapsam çözünürlüğünü her yerde kullanmanızı gerektirebilir
    • yapmak zorundasın
        length( makeCross( vecA, vecB ) )
      ya
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      da başka türlü deneyebilirsin
        vecA.cross( vecB ).length()
  • bakımlı değil
    • hala "beta" olarak iddia ediliyor
    • normal işlevselliği kullanmak için hangi başlıklara ihtiyaç duyulduğu gibi temel bilgileri eksik belgeler
      • Vec.h, Vektörler için işlemler içermez, VecOps.h bazılarını içerir, diğerleri Generate.h dosyasındadır. VecOps.h içinde çapraz (vec &, vec &, vec &), Generate.h içinde [make] cross (vec &, vec &)
  • olgunlaşmamış / kararsız API; hala değişiyor.
    • Örneğin "cross", "VecOps.h" den "Generate.h" e taşındı ve daha sonra adı "makeCross" olarak değiştirildi. Artık mevcut olmayan işlevlerin eski sürümlerine başvurduğu için dokümantasyon örnekleri başarısız oluyor.

NT2

Anlayamıyorum çünkü web sayfalarının fraktal resim başlığına içerikten daha fazla ilgi duyuyorlar. Ciddi bir yazılım projesinden çok akademik bir projeye benziyor.

En son 2 yıl önce yayınlandı.

Görünüşe göre İngilizce hiçbir belge olsa bir yerde Fransızca bir şey var.

Proje çevresinde bir topluluğun izini bulamıyorum.

DİZÜSTÜ & BLAS

Faydaları: Yaşlı ve olgun.

Downsides:

  • gerçekten berbat API'lerle dinozorlar kadar eski

1
Eigen hizalanmış varsayımlarla ilgili olarak: küçük veri setleri için SSE (1,2,3 veya 4) işlemlerinden yüksek performans elde etmek için, kesinlikle hizalanmış verilere ihtiyacınız vardır. Hizalanmamış yük / depolama işlemleri çok daha yavaştır. Hizalanmış veya hizalanmamış yük / depolama arasındaki karar da zaman alır. Herhangi bir "genel amaçlı" uygulama, arayüzü "hizalı" ve "hizasız" operasyonlara da ayırmadıkça herkes için doğru olanı yapmak için gerçekten zor bir zaman olurdu - ve sonra yine çok genel bir amaç değildir.
Joris Timmermans

@Catskul Eigen3 kullanmak istiyorum. "Güvensiz hale getiren optimizasyonların bir tanımla kapatılabileceğini" genişletebilir misiniz? Eğer Eigen2 altında listelemek diğer hususlar dikkatle ayrıntılı olarak verilmektedir doc altında hizalama konularına ilişkin Konu . Bu sorunlarla yaşayabilirim.
Ali

Güvenlik ile ilgili sorunları ilgili tüm hizalamaya atıfta bulunuyorum ve Eigen2 ile aynı. Eigen2 ile ilgili sorun yoksa Eigen3 ile iyi olacaksınız.
Catskul

2
BLAS ve LAPACK aslında kütüphaneler değil, spesifikasyonlar / API'lar. ilk uygulamalarından netlib veya ATLAS ve OpenBLAS gibi diğer uygulamalardan bahsedebilirdiniz.
Foad

12

Değeri için, hem Eigen hem de Armadillo'yu denedim. Aşağıda kısa bir değerlendirme yer almaktadır.

Eigen Avantajları: 1. Tamamen müstakil - harici BLAS veya LAPACK'a bağımlı değildir. 2. Belgeler iyi. 3. Test edilemese de hızlı.

Dezavantaj: QR algoritması, R matrisi üst üçgenin içine gömülü olarak sadece tek bir matris döndürür. Matrisin geri kalan kısmının nereden geldiği hakkında bir fikir yoktur ve hiçbir Q matrisine erişilemez.

Armadillo Avantajları: 1. Çok çeşitli ayrışma ve diğer fonksiyonlar (QR dahil). 2. Oldukça hızlı (ifade şablonlarını kullanır), ama yine, gerçekten yüksek boyutlara itmedim.

Dezavantajları: 1. Matris dekompozisyonları için harici BLAS ve / veya LAPACK'e bağlıdır. 2. Belgelerde IMHO mevcut değil (#define ifadesini değiştirmekten başka, LAPACK wrt özellikleri dahil).

Kendi kendine yeten ve kullanımı kolay bir açık kaynak kitaplığı mevcut olsaydı iyi olurdu. Aynı sorunu 10 yıldır yaşadım ve sinir bozucu oluyor. Bir noktada, C için GSL kullandım ve etrafına C ++ sarmalayıcıları yazdım, ancak modern C ++ ile - özellikle ifade şablonlarının avantajlarını kullanarak - 21. yüzyılda C ile uğraşmak zorunda kalmamalıyız. Sadece benim tuppencehapenny.


2
Armadillo , Matlab benzeri bir sözdizimine sahiptir, böylece kullanımı kolaydır. "Belgeler eksik ... özellikleri wrt LAPACK" hakkında ne demek emin değilim. Dokümantasyon, kullanıcı tarafından kullanılabilen tüm fonksiyonları ve bunların nasıl kullanılacağına ilişkin örnekleri açıkça belgelemektedir. C ++ sarıcı kitaplığıyla ilgili tüm mesele, LAPACK'in karmaşıklığını ve ayrıntı düzeyini soyutlamaktır. Armadillo'nun LAPACK'i nasıl çağırdığını görmek istiyorsanız kaynağa her zaman göz atabilirsiniz.
10'da mtall

Eigen'deki QR ayrışması hakkında, Eigen2 veya Eigen3'ü mü kastediyorsunuz?
qed

11

Intel işlemcilerde yüksek performanslı matris / doğrusal cebir / optimizasyon arıyorsanız Intel'in MKL kütüphanesine bakarım.

MKL hızlı çalışma süresi performansı için özenle optimize edilmiştir - bunların çoğu çok olgun BLAS / LAPACK fortran standartlarına dayanmaktadır. Ve performansı mevcut çekirdek sayısı ile ölçeklendirilir. Mevcut çekirdeklerle eller serbest ölçeklenebilirliği, bilgisayar kullanımının geleceğidir ve yeni bir proje için çok çekirdekli işlemcileri desteklemeyen herhangi bir matematik kütüphanesi kullanmam.

Çok kısaca şunları içerir:

  1. Temel vektör-vektör, vektör-matris ve matris-matris işlemleri
  2. Matris çarpanlara ayırma (LU decomp, hermityan, seyrek)
  3. En küçük kareler uydurma ve özdeğer problemleri
  4. Seyrek doğrusal sistem çözücüleri
  5. Doğrusal olmayan en küçük kareler çözücü (güven bölgeleri)
  6. Artı FFT ve evrişim gibi sinyal işleme rutinleri
  7. Çok hızlı rasgele sayı üreteçleri (mersenne twist)
  8. Çok daha fazlası .... bakınız: bağlantı metni

Bir dezavantajı, MKL API'sinin ihtiyacınız olan rutinlere bağlı olarak oldukça karmaşık olabilmesidir. Ayrıca, yüksek performanslı görüntü işleme operasyonlarına yönelik olan, ancak yine de oldukça geniş olan IPP (Entegre Performans İlkelleri) kütüphanelerine de göz atabilirsiniz.

Paul

CenterSpace Yazılımı, .NET Matematik kütüphaneleri, centerpace.net


8

Eigen ve NT2 hakkında iyi şeyler duydum , ama kişisel olarak da kullanmadım. Dişte biraz uzadığına inandığım Boost.UBLAS da var . NT2'nin geliştiricileri, bir sonraki sürümü, Boost'a almak amacıyla inşa ediyorlar, bu da bir şey için sayılabilir.

Linim. alg. ihtiyaçları 4x4 matris kasasının ötesinde garanti edilmez, bu yüzden gelişmiş işlevsellik hakkında yorum yapamam; Sadece bazı seçeneklere dikkat çekiyorum.


Deneyimlerime göre (daha büyük matrisler), Boost.UBLAS daha çok kullanılır. Ancak, içine baktığımda, hoşuma gitmedi (esas olarak dokümantasyon nedeniyle), bu yüzden Eigen üzerinde yoğunlaştım. Eigen'in bir geometri modülü var , ama ben kendim kullanmadım.
Jitse Niesen

Eigen görünüşe göre ROS (söğüt garajı), Celestia, Koffice ve libmv tarafından kullanılıyor. UBLAS hakkında biraz konuştum, ancak projeyi kullanarak reklam veren zor zamanlar geçirdim. NT2 için Ditto. Ne kadar iyi şeyler duyduğunuzu açıklayabilir misiniz?
Catskul

Boost posta listesine ilişkin bir tartışmada Boost'a modern bir LinAlg kütüphanesi eklemekle ilgili bir tartışma vardı - Eigen ve NT2'nin her ikisi de olası adaylar olarak belirtildi, ancak yalnızca NT2 geliştiricileri bunu takip etmeye ilgi duyduklarını ifade ettiler. Her iki kütüphane de iyi görünüyordu; Dediğiniz gibi, Eigen biraz daha popüler ve aynı zamanda daha fazla C ++ - ish; NT2, MATLAB'ı mümkün olduğunca taklit edecek şekilde tasarlanmıştır.
Jeff Hardy

8

Bu konuda yeniyim, bu yüzden çok şey söyleyemem, ancak BLAS bilimsel hesaplamada standarttır. BLAS aslında birçok uygulamaya sahip bir API standardıdır. Hangi uygulamaların en popüler ya da neden olduğuna dürüstçe emin değilim.

Ortak lineer cebir işlemlerini de yapmak istiyorsanız (çözme sistemleri, en küçük kareler regresyonu, ayrışma, vb.) LAPACK'e bakın .


7

GLM ne olacak ?

OpenGL Gölgelendirme Dili (GLSL) spesifikasyonuna dayanır ve MIT lisansı altında yayınlanır. Açıkça grafik programcılarına yönelik


grafik programlama vektörü ve matrisler sağlar. GLSL ile uyumlu tutmak için güzel bir ek yük getirir (GLSL'de yapabilirseniz, çoğu zaman GLSL'de yapmak özellikle GL 4.x ile daha iyidir) ve birçok grafik programlama ilkesini (frustum, AABB, BB, elipsoid) kaçırır ). Swizzle arayüzü obez. Çok daha iyi bir alternatif, bazı kod üretimi ile oluşturulan ".xyzz ()" fonksiyonlarına sahip olsaydı olurdu. Opengl uygulamalarını prototiplemek ve negatif yönlerini daha büyük projelerde göstermeye başlamak istediğinizde mükemmeldir. asla matematik kütüphanesini kodlamayın.
CoffeDeveloper

5

Eigen için oy ekleyeceğim: Farklı kütüphanelerden buna çok sayıda kod (3D geometri, doğrusal cebir ve diferansiyel denklemler) taşıdım - neredeyse tüm durumlarda hem performansı hem de kod okunabilirliğini geliştirdim.

Bahsedilmeyen bir avantaj: SSE'yi Eigen ile kullanmak çok kolaydır, bu da 2D-3D işlemlerin performansını önemli ölçüde geliştirir (her şeyin 128 bite kadar doldurulabileceği yerlerde).


1
Bütün "bunu yaparsanız emin olun ..." şey bana biraz kırmızı bayrak gibi vuruyor. Şimdiye kadar iki kez bu sorunlarla karşılaştım ve kullanmaya başladım. Gelecekteki geliştiricilere, her bir kütüphanenin her türlü idiyosenkrasisini bilmek için yük etmemeyi umuyordum: özellikle üyeleriniz olduğunda belirli makroları kullanmıyorsanız çöktüğü hizalama sorunları ve bireyler için işlevselliği yaydıkları gerçeği birden çok başlıkta sınıflar. Yalnız seçmemi engellemeyebilir, ancak biraz kırmızı bayrak gönderilir.
Catskul

1
Hizalama ve bu makro yalnızca SSE kullandığınızda önemlidir, bu da zorunlu değildir. SIMD kullanırsanız, kullandığınız kitaplık ne olursa olsun bu sorunlar artacaktır. En azından Eigen sadece çökmüyor, aynı zamanda doğrudan soruna işaret eden anlamlı hata mesajları veriyor.
ima

Ve hizalama makrosundan kaçınmanın kolay bir yolu vardır - üye olarak işaretçileri veya referansları kullanın.
ima

1
Bunun doğru olduğunu düşünmüyorum. Özel SSE seçenekleri kullanmadım ve stl kaplarıyla kullandıktan sonra birkaç çökme yaşadım. Evet, size yardımcı mesajlar verdiğini biliyorum ve Evet, özel talimatlar olduğunu biliyorum, ama bu benim amacım. Diğer geliştiricilere dahil edilen her kütüphane için özel talimatlar yüklemek istemiyorum. Örneğin değerden geçme, çok fazladır.
Catskul

Sadece en son geliştirme dalının hizalamayı kapatmak ve ilgili sorunları önlemek için kullanabileceğiniz bazı tanımları olduğunu öğrendim.
Catskul

4

Tamam, sanırım ne aradığını biliyorum. Reed Copsey'in önerdiği gibi GGT'nin oldukça iyi bir çözüm olduğu anlaşılıyor.

Şahsen, kendi küçük kütüphanemizi yuvarladık, çünkü rasyonel noktalarla çok fazla rasyonel NURBS ve Bezier ilgileniyoruz.

Çoğu 3D grafik kütüphanesinin, projektif matematikte temeli olmayan projektif noktalarla hesaplamalar yaptığı ortaya çıkıyor, çünkü bu size istediğiniz cevabı veriyor. Sonunda sağlam bir teorik dayanağı olan ve puan türü sayısını azaltan Grassmann puanlarını kullandık. Grassmann noktaları temel olarak insanların şu anda kullandığı hesaplamalar ve sağlam bir teorinin avantajı. En önemlisi, aklımızdaki şeyleri daha açık hale getiriyor, bu yüzden daha az hata var. Ron Goldman, bilgisayar grafiklerinde Grassmann noktalarına "Bilgisayar Grafiklerinin Cebirsel ve Geometrik Temelleri Üzerine" adlı bir makale yazdı .

Sorunuzla doğrudan ilgili değil, ilginç bir okuma.


Ödüllerin ne olduğunu bilmediğim için kasıtlı olarak açık uçlu. Büyük olasılıkla geometrinin ana kaygımız olduğunu söylemek geometrinin boyutluluğunun net olmadığını söylemek doğrudur. Şu anda 2/3 (2 + zaman) ve varsayımsal olarak oldukça yüksek olabilir (3dims + time + multi-dim-costmaps).
Catskul

Bu soru ile hemfikirim. Örneğin, bu tür birçok uygulama gerçek zamanlı (tutarlı zaman davranışı) performansına ihtiyaç duyarken, birçoğu doğruluk için tutarlılık ve / veya hızdan vazgeçmektedir.
TED

Peki araştırdığınız kütüphanelerden hiçbirinin NURBS ve Beziers ile ilgilenmediğini mi söylüyorsunuz? Mevcut kütüphanelerden birini almamanın ve NURBS ve Bezier desteğini onun yanında inşa etmemenin özel bir nedeni var mı?
Catskul

Söylemeye çalıştığım şey, rasyonel NURBS ve Beziers'ın rasyonel kontrol noktalarını çoğu 3d uygulamadan çok daha fazla kullandıklarıdır, bu yüzden daha fazla hata yapıyorduk. Genellikle çoğu 3d uygulama perspektif dönüşümünden sonraya kadar sadece vanilya 3d noktalarına ve vektörlere sahiptir. Algoritmalarımızla birçoğu doğru, vb geri gidiyor ve ileri, / / rasyonel yansıtmalı ve kartezyen noktaları ağırlıklı tanıtıcı edebilmek zorunda
tfinniga


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.