IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Prekerka se zamenou sloupcu u matice

Aktivity
Avatar
Radek Letáček:4.7.2019 20:12

Ahoj, mám takový problém se záměnou sloupců v matici. Jedná o školní příklad. Zkouším to vyřešit, ale nějak jsem se zasekl. Má se vyměnit pouze sloupec s maximálním součtem. Součet jsem nějak udělal a uložil si ho do pole(už tady nevím jestli to řeším správně, ale nevím jak jinak bych součty měl spjaté s indexem - tedy s číslem sloupce) . A měnit by mi to mělo za stejný sloupec z druhé matice. Nechci to od Vás celé vyřešit, baví mě to, ale nějak kousek pošoupnout či poradit :)

Btw: tohle není můj účet, ale kamaráda :)

Zkusil jsem:

public void zamenSloupce(Matice m) {

        int maxSoucet = Integer.MIN_VALUE;
        int[] poleSouctu = new int[pocetSloupcu];
        for (int i = 0; i < pocetSloupcu; i++) {
            int soucet = 0;
            for (int j = 0; j < pocetRadku; j++) {

                soucet += prvkyMatice[j][i];
            }
            poleSouctu[i] = soucet;
            if (poleSouctu[i] > maxSoucet) {
                maxSoucet = poleSouctu[i];
            }

            System.out.println(poleSouctu[i]);

        }
        System.out.println("\n" + maxSoucet);
Editováno 4.7.2019 20:13
 
Odpovědět
4.7.2019 20:12
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Radek Letáček
DarkCoder:4.7.2019 20:58

Znáš-li rozměr matice, znáš počet sloupců matice. Znáš-li počet sloupců matice, znáš kolik iterací cyklu bude třeba pro zjištění sloupce s největším součtem. Chceš-li počítat iterace, musíš založit celočíselnou proměnnou pro iterace. Chceš-li najít sloupec s největším součtem, musíš projít všechny sloupce. Chceš-li porovnávat součty různých sloupců, musíš uchovávat součet dosud prošlého největšího sloupce. Chceš-li uchovávat největší součet, musíš založit proměnnou pro maximální součet. Chceš-li uchovávat index sloupce s největším součtem, musíš založit proměnnou pro index sloupce s největším součtem. Chceš-li zjistit, jaký index má sloupec s největším součtem, musíš aktualizovat proměnnou index. Když je součet aktuálně procházeného sloupce větší než dosud největší hodnota součtu, aktualizuješ index. Průchodem všemi sloupci zjistíš, který sloupec má největší součet a jaký má index. Znáš-li index sloupce s největším součtem, znáš který sloupec máš prohazovat.

Nahoru Odpovědět
4.7.2019 20:58
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Radek Letáček:4.7.2019 21:16

Díky, nad tvou odpovědí se zamyslím zítra :) Nicméně zatím jsem domyslel toto:

ublic void zamenSloupce(Matice m) {

        int maxSoucet = Integer.MIN_VALUE;
        int[] poleSouctu = new int[pocetSloupcu];
        for (int i = 0; i < pocetSloupcu; i++) {
            int soucet = 0;
            for (int j = 0; j < pocetRadku; j++) {

                soucet += prvkyMatice[j][i];
            }
            poleSouctu[i] = soucet;
            if (poleSouctu[i] > maxSoucet) {
                maxSoucet = poleSouctu[i];

                for (int k = 0; k <pocetRadku ; k++) {
                    int pom;
                    pom = prvkyMatice[k][i];
                    prvkyMatice[k][i] = m.prvkyMatice[k][i];
                    m.prvkyMatice[k][i]=pom;
                }

            }

            System.out.println(poleSouctu[i]);

        }
        System.out.println("\n" + maxSoucet);

bohužel zase nastal problém s tím, že mi to pokaždé prohodí 1. sloupec. Jelikož podmínka je platná :/

 
Nahoru Odpovědět
4.7.2019 21:16
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Radek Letáček
DarkCoder:4.7.2019 22:58

Řešení je snadné. Nejsem Javista a tak to napíši v C.
Princip činnosti kódu by ale měl být jasný...

// Ověření validity matice (kladné rozměry)

// Kalkulace prvního sloupce
index = 0;
summax = 0;
for (i = 0; i < m; i++) summax += mat[i][0];

// Kompletní kalkulace
for (j = 1; j < n; j++) {
        sum = 0;
        for (i = 0; i < m; i++) sum += mat[i][j];
        if (sum > summax) {
                summax = sum;
                index = j;
        }
}

// proměnná index nyní obsahuje index sloupce s největším součtem

// Prohození sloupců
Nahoru Odpovědět
4.7.2019 22:58
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Radek Letáček:5.7.2019 18:09

Díky moc :) Nakonec z toho vyšlo tohle :) Jelikož ty původní matice mají zůstat nezměněny :)

public Matice[] zamenSloupce(Matice m) {

        Matice[] maticeZamenene = new Matice[2];
        Matice matC = new Matice(pocetRadku, pocetSloupcu);
        Matice matD = new Matice(m.pocetRadku, m.pocetSloupcu);

        //duplikace první první matice
        for (int i = 0; i < matC.pocetRadku; i++) {
            for (int j = 0; j < matC.pocetSloupcu; j++) {
                matC.prvkyMatice[i][j] = prvkyMatice[i][j];
            }
        }
        //duplikace druhé matice
        for (int i = 0; i < matD.pocetRadku; i++) {
            for (int j = 0; j < matD.pocetSloupcu; j++) {
                matD.prvkyMatice[i][j] = m.prvkyMatice[i][j];
            }
        }

        int index = 0;
        int maxSoucet = 0;
        for (int i = 0; i < pocetRadku; i++) {
            maxSoucet += prvkyMatice[i][0];

        }

        for (int i = 1; i < pocetSloupcu; i++) {
            int soucet = 0;
            for (int j = 0; j < pocetRadku; j++) {

                soucet += prvkyMatice[j][i];
            }
// uložení indexu sloupce s max součtem a uložení maxsoučtu do proměnných
            if (soucet > maxSoucet) {
                maxSoucet = soucet;
                index = i;

            }

        }
//záměna prvků slupce matice s maxsoučtem
        for (int i = 0; i < pocetRadku; i++) {

            int pom;
            pom = matC.prvkyMatice[i][index];
            matC.prvkyMatice[i][index] = matD.prvkyMatice[i][index];
            matD.prvkyMatice[i][index] = pom;

        }
        //uložení nových matic do pole
        maticeZamenene[0] = matC;
        maticeZamenene[1] = matD;
        return maticeZamenene;

    }
 
Nahoru Odpovědět
5.7.2019 18:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.