Násobení matic a automatické přetypování

JSH

Re:Násobení matic a automatické přetypování
« Odpověď #15 kdy: 17. 09. 2015, 15:49:44 »
To by byl ten případ s (implicitním) přetypováním (operator SquareMatrix()), nicméně ani to mi neumožní napsat v C++ něco jako (m1*m2).trace() (na rozdíl od Swiftu).
Jo, v C++ by bylo třeba něco jako "square(m1*m2).trace()". To není zas tak zlé.


k

Re:Násobení matic a automatické přetypování
« Odpověď #16 kdy: 17. 09. 2015, 15:52:39 »
Lze to použít

Možná to lze to přeložit, ale nelze to použít v případě kdy výsledek operace nebude čtvercová matice. Pak se stane co ? Výjimka ? Runtime error ?

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Násobení matic a automatické přetypování
« Odpověď #17 kdy: 17. 09. 2015, 15:52:57 »
To by byl ten případ s (implicitním) přetypováním (operator SquareMatrix()), nicméně ani to mi neumožní napsat v C++ něco jako (m1*m2).trace() (na rozdíl od Swiftu).
Jo, v C++ by bylo třeba něco jako "square(m1*m2).trace()". To není zas tak zlé.
Je mi ovšem záhadou, proč to C# nepovolí.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Násobení matic a automatické přetypování
« Odpověď #18 kdy: 17. 09. 2015, 15:55:42 »
Lze to použít

Možná to lze to přeložit, ale nelze to použít v případě kdy výsledek operace nebude čtvercová matice. Pak se stane co ? Výjimka ? Runtime error ?
Pochopitelně chyba za běhu, to jinak řešit nejde. Kdo explicitně použije trace, očekává čtvercovou matici. Zajímavé by bylo implementovat "inverse", protože to jde i s nečtvercovou maticí.

k

Re:Násobení matic a automatické přetypování
« Odpověď #19 kdy: 17. 09. 2015, 16:12:25 »
Pochopitelně chyba za běhu, to jinak řešit nejde. Kdo explicitně použije trace, očekává čtvercovou matici.

Takže musíte vědět předem, jaké třídy bude výsledek. To je samozřejmě možné přes pomocnou metodu m1.MultiplyWillProduceSquare(m2), ale je to práce navíc.


zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Násobení matic a automatické přetypování
« Odpověď #20 kdy: 17. 09. 2015, 16:21:49 »
Pochopitelně chyba za běhu, to jinak řešit nejde. Kdo explicitně použije trace, očekává čtvercovou matici.

Takže musíte vědět předem, jaké třídy bude výsledek. To je samozřejmě možné přes pomocnou metodu m1.MultiplyWillProduceSquare(m2), ale je to práce navíc.

To je ale zbytečné a navíc ekvivalentní explicitnímu přetypování. Čili bez možnosti polymorfismu návratové hodnoty to nejde.

k

Re:Násobení matic a automatické přetypování
« Odpověď #21 kdy: 17. 09. 2015, 17:08:17 »
To je ale zbytečné a navíc ekvivalentní explicitnímu přetypování. Čili bez možnosti polymorfismu návratové hodnoty to nejde.

Takže zavoláte (m1*m2).trace() a když to zbuchne na runtime error, tak víte že SquareMatrix se nekoná a pokračujete kódem pro Matrix :)

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Násobení matic a automatické přetypování
« Odpověď #22 kdy: 17. 09. 2015, 17:32:43 »
To je ale zbytečné a navíc ekvivalentní explicitnímu přetypování. Čili bez možnosti polymorfismu návratové hodnoty to nejde.

Takže zavoláte (m1*m2).trace() a když to zbuchne na runtime error, tak víte že SquareMatrix se nekoná a pokračujete kódem pro Matrix :)
Když volám trace, tak vím, že jde o čtvercovou matici.

k

Re:Násobení matic a automatické přetypování
« Odpověď #23 kdy: 17. 09. 2015, 17:36:33 »
Když volám trace, tak vím, že jde o čtvercovou matici.

A prozradíte odkud to víte, že výsledek m1*m2 je čtvercová matice ?

JS

Re:Násobení matic a automatické přetypování
« Odpověď #24 kdy: 17. 09. 2015, 17:42:12 »
To přece šlo vždycky, z násobení dostanete obecný prapředek Object a zeptáte se přes nějaké instanceof, zda máte jednu nebo druhou instanci a podle toho přetypujete a pokračujete dál.

Ono jde asi o to, jak to udělat bez instanceof a přetypování.

Ale to nejde udelat bez pretypovani! To vyplyva z jeho otazky. Chce z dvou obecnych matic dostat ctvercovou, ale jenom nekdy. Z toho plyne, ze bud:

  • Zakoduje informaci o velikosti matice do typoveho systemu (pokud to vubec umoznuje).
  • Pretypuje vysledek za behu.

To prvni asi nechce, jak jini napsali. Takze to musi pretypovat.

Je treba si uvedomit, ze typy v programovacich jazycich slouzi k (minimalne) trem rozdilnym ucelum. Z toho pak vyplyvaji tyto zmatky.

Alt

Re:Násobení matic a automatické přetypování
« Odpověď #25 kdy: 17. 09. 2015, 17:43:57 »
Ehm ...
ved nasobenie matic je nejaka metoda/funkcia. V nej bude najprv volany konstruktor pre vytvorenie vyslednej matice a tam moze byt volany konstruktor podla toho ci vysledkom bude stvorcova matica alebo nie.
Napr. pre python nieco take:

Kód: [Vybrat]
class ObdlzMatica():
    def sucin(self, matica):
        if self.stlpce == matica.riadky:
            sucin = StvorMatica()
        else:
            sucin = ObdlzMatica()

        # Kod sucinu

        return sucin


class StvorMatica(ObdMatica):
    def determinant(self):
        pass

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Násobení matic a automatické přetypování
« Odpověď #26 kdy: 17. 09. 2015, 17:49:33 »
To přece šlo vždycky, z násobení dostanete obecný prapředek Object a zeptáte se přes nějaké instanceof, zda máte jednu nebo druhou instanci a podle toho přetypujete a pokračujete dál.

Ono jde asi o to, jak to udělat bez instanceof a přetypování.

Ale to nejde udelat bez pretypovani! To vyplyva z jeho otazky. Chce z dvou obecnych matic dostat ctvercovou, ale jenom nekdy. Z toho plyne, ze bud:

  • Zakoduje informaci o velikosti matice do typoveho systemu (pokud to vubec umoznuje).
  • Pretypuje vysledek za behu.

To prvni asi nechce, jak jini napsali. Takze to musi pretypovat.

Je treba si uvedomit, ze typy v programovacich jazycich slouzi k (minimalne) trem rozdilnym ucelum. Z toho pak vyplyvaji tyto zmatky.

Pravě že ne. Třetí cesta je polymorfismus návratové hodnoty (jde to ve Swiftu, jinak nevím, kde ještě).

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Násobení matic a automatické přetypování
« Odpověď #27 kdy: 17. 09. 2015, 17:51:04 »
Ehm ...
ved nasobenie matic je nejaka metoda/funkcia. V nej bude najprv volany konstruktor pre vytvorenie vyslednej matice a tam moze byt volany konstruktor podla toho ci vysledkom bude stvorcova matica alebo nie.
Napr. pre python nieco take:

Kód: [Vybrat]
class ObdlzMatica():
    def sucin(self, matica):
        if self.stlpce == matica.riadky:
            sucin = StvorMatica()
        else:
            sucin = ObdlzMatica()

        # Kod sucinu

        return sucin


class StvorMatica(ObdMatica):
    def determinant(self):
        pass

V dynamickém jazyce to půjde vždy, to je jasné. Tady se řeší staticky typovaný jazyk.

k

Re:Násobení matic a automatické přetypování
« Odpověď #28 kdy: 17. 09. 2015, 18:18:38 »
Třetí cesta je polymorfismus návratové hodnoty (jde to ve Swiftu, jinak nevím, kde ještě).

Už jsme si ukázali že ne. Jestliže v metodě sedí trpaslík a podle své momentální nálady vyhazuje ven instanci Matrix nebo instanci SquareMatrix, tak je polymorfismus návratové hodnoty nepoužitelný.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Násobení matic a automatické přetypování
« Odpověď #29 kdy: 17. 09. 2015, 20:27:45 »
Třetí cesta je polymorfismus návratové hodnoty (jde to ve Swiftu, jinak nevím, kde ještě).

Už jsme si ukázali že ne. Jestliže v metodě sedí trpaslík a podle své momentální nálady vyhazuje ven instanci Matrix nebo instanci SquareMatrix, tak je polymorfismus návratové hodnoty nepoužitelný.

Tak si to napiš (ve Swiftu). Jasně, je to náročné na pochopení, ale Swift to umí, funkční implementace je důkaz.