2016-04-03 23 views
4

Hem gerçek hem de karmaşık matrisleri işleyebilen bir matris sınıfı uygulamaya çalışıyorum. Çarpma operatörünü aşırı yüklemeye çalışırken sorunlara karışıyorum. Özellikle, bir çift matrisi karmaşık bir matrisle (o sırayla) çarpmaya çalıştığımda. Sonuç karmaşık olmalı, ancak * operatör bir çift matrisin bir üyesidir, karmaşık bir matrisin nasıl döndüğünü göremiyorum (bir arkadaş operatörünü kullanarak denedim, bu da işe yaramıyor.). İlgili kod snippet'ine: YaniC++ Hem Real hem de Karmaşık Matrisler ile bir Matrix Sınıfı için Operatör Aşırı Yüklemesi

template <class V> Matrix<T> operator *(const Matrix<V> &b) 
{ 
    long i, j, k; T temp; Matrix<T> c(mRows, b.Cols()); 

    for (i = 0; i < mRows; i++) 
     for (j = 0; j < c.Cols(); j++) 
     { 
      for (temp = 0, k = 0; k < mCols; k++) 
       temp += this->Element(i, k)*b.Element(k, j); 

      c(i, j) = temp; 
     } 

     return c; 
} 

, Gerçek ve B ve C kompleksi ise, C = B bir çalışıyor, ancak C A B değil =. Özellikle, derleyici hatası, tip karmaşık (veya kabul edilebilir bir dönüştürme) alan global operatör bulunamadı diyerek "temp + =" satırını işaretler. Şablonu gerçek ve karmaşık tipler için tamamen uzmanlaştırmaktan kaçınmak istiyorum, bunun bir yolu var mı?

Şimdiden teşekkürler.

+0

Sen şablonu ' Matris operatör * (const Matrix & a, const Matris & b)' –

+0

Ayrıca bkz [Operatör Aşırı] (http://stackoverflow.com/questions/4421706/operator-overloading) beyan etmek istiyorum Lütfen. –

+0

Teşekkürler, ama bu bir arkadaş operatörü olarak ilan edilmeli, değil mi? Ve bu yeni bir problem yaratır, yani birden fazla operatör işlenenlerle eşleşir. – DJM123

cevap

-1

ben bu sorunu düşünüyorum: this-> Eleman (...) i sabit yapmak için tam olarak ne olduğunu bilmiyorum

. ama matrisin yerini değiştirmek için emrediyorum. bu durumda, (matris sınıfı ile friend ed halini aldığı) operator* olmayan bir elemanı aşırı kullanmak için daha iyi, yorumlar de belirtildiği gibi, - (A <> B)

+1

Üzgünüm, ne yazdığını anlamadım. Daha fazla detaylandırır mısın? – surajsn

+0

anlatırsın: C = BA iyi çalışıyor ama C = AB çalışmıyor. Anlatıyorum: bu problemi çözmek için iki yol var. 1. Professional 2. Mühendislik yol 2, basittir. Bu şekilde cevabın mümkün olan en kolay şekilde alındığını söyleyin. Cevap matrisi A ve B ile birlikte cevabı alırsınız. diğer elinize, C = AB'yi C = BA'ya çevirirsiniz.Yanıt sarılmış yol almak için basit bir yol arıyor –

+0

Bro. !!! Sözlerimi ** ciddi olarak ** ama kişisel olarak düşünmemenizi rica ediyorum. Profilinizi gördüm, burada cevap yazmak için çok hevesliydiniz, bu çok hoş. ama cevaplarınızın çoğunun ** aşağıya oy verildiğini kolayca görebiliyordum **. Cevaplarını gördüm ve onları iyi açıklamamanı öğrendim. bu yüzden cevabı yazmadan önce biraz araştırma yapmanı ve her zaman tekrar etmeyi denememi isterim. Her zaman cevap yazarken her zaman elinden gelenin en iyisini yapmaya çalışıyorum çünkü ün ve rozet ile ilgili değil. Elinizden gelenin en iyisini vermekle ilgili, o yüzden bunu kabul etmeyin. ** Gülümseyen ve Mutlu kodlamaya devam et **. :) – surajsn

2

.

Fakat bunun neden çalışmadığı bir sebep değil. Buradaki sorun sizin sınıfının operator* içinde

T temp; Matrix<T> c; 

ilanıdır.

using C = std::common_type_t<T,U>; 
C temp; Matrix<C> c; 

Aksi döndü matris elemanı tipi daima çağıran matrisi ile aynı olacaktır: Her T std::common_type_t<T,U> ile değiştirmelisiniz. Yani, C = A.operator*(B) olarak çözümlenen C = A*B aradığınızda, C öğesinin öğesi A ile aynı olacaktır. Açıkçası yanlış - A bir Matrix<double> ve bir Matrix<complex<double> > ile çarpın eğer

Sonra dönüş gibi bir Matrix<double> tanınacak.

+0

Fantastik, bu çözümü sevdim, teşekkürler! Aslında, orijinal, ikili aşırı yükleme formülasyonu ile çalışır *; Bu yaklaşımdan kaçınmak için bir sebep var mı, yani arkadaş aşırı yüklenmeler tercih edilir mi? – DJM123

+0

@ DJM123: rica ederim. Soruya bakın, bkz. [here] (http://stackoverflow.com/a/4421729/2412846). – davidhigh

+0

@ DJM123: ... ama benim bağlantım üye olmayan aşırı yükü kullanmak için bir motivasyon sağlamaz, bu yüzden daha iyi bakın [burada] (http://stackoverflow.com/a/4622467/2412846). – davidhigh

İlgili konular