2015-07-07, 14:33
  #1
Medlem
mschiefs avatar
Kod:
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3

Jag har kolumner a-e och rad 1-3. Värdena minskar med varierande differens när vi går med en rad. a1>a2, b2>b3 etc. Jag måste hitta den kombination av en siffra från varje kolumn som ger högst värde. Problemet är bara det att det måste finnas två siffror från rad 2 och två från rad 3.

T.ex.
a1 + b2 + c3 + d3 + e2

eller
a2 + b3 + c2 + d1 + e3

Spelar ingen roll om det görs med excel, matlab, mathematica, algebraiskt etc. Detta är ett vardagsproblem som jag försöker lösa, men är lite osäker hur.

edit: eller typ skapa en lista med summan av varje kombination.
__________________
Senast redigerad av mschief 2015-07-07 kl. 14:37.
Citera
2015-07-07, 15:17
  #2
Medlem
yggdrazils avatar
Citat:
Ursprungligen postat av mschief
Kod:
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3

Jag har kolumner a-e och rad 1-3. Värdena minskar med varierande differens när vi går med en rad. a1>a2, b2>b3 etc. Jag måste hitta den kombination av en siffra från varje kolumn som ger högst värde. Problemet är bara det att det måste finnas två siffror från rad 2 och två från rad 3.

T.ex.
a1 + b2 + c3 + d3 + e2

eller
a2 + b3 + c2 + d1 + e3

Spelar ingen roll om det görs med excel, matlab, mathematica, algebraiskt etc. Detta är ett vardagsproblem som jag försöker lösa, men är lite osäker hur.

edit: eller typ skapa en lista med summan av varje kombination.
I excel kan man väl köra "=max(a1:a4)" för att få max i en kolumn. Sedan kan du addera "=sum(a5:d5)" eller något.

Syntaxen är jag inte säker på, men metoderna finns.
Citera
2015-07-07, 23:57
  #3
Medlem
Här har du en matlab-kod som borde funka:

Kod:
A=[släng in din matris här (endast dimension 3x5)];

svar = -inf;
for a = 1:5
    for b = 1:5
        for c = 1:5
            for d = 1:5
                for e = 1:5
                    if length(unique([a b c d e]))==5
                        if sum([A(1,a) A(2,[b c]) A(3,[d e])])>svar
                            svar = sum([A(1,a) A(2,[b c]) A(3,[d e])]);
                            komb = zeros(size(A));
                            komb(1,a) = 1;
                            komb(2,[b c]) = 1;
                            komb(3, [d e]) = 1;
                        end
                    end
                end
            end
        end
    end
end

svar
komb
__________________
Senast redigerad av El-Duderino 2015-07-08 kl. 00:07.
Citera
2015-07-08, 02:50
  #4
Medlem
Skyrmions avatar
Citat:
Ursprungligen postat av El-Duderino
Här har du en matlab-kod som borde funka:


Meh.. använd inte loopar i matlab

Detta är omkring 200 ggr snabbare:
Kod:
A=[3x5 matris];

komb = zeros(size(A));
A_tmp = [A(1,:);A(2,:);A(2,:);A(3,:);A(3,:)];

[svar,index] = max(sum(A_tmp(sub2ind(size(A_tmp),perms(1:5),repmat(1:5,120,1))),2));

svar
komb(sub2ind(size(A),[1,2,2,3,3],rows(index,:))) = 1

Men du får själv lista ut vad jag gör
Citera
2015-07-08, 13:33
  #5
Medlem
mschiefs avatar
Haha, grymt. Tack för hjälpen båda.
Citera
2015-07-08, 21:56
  #6
Medlem
Citat:
Ursprungligen postat av Skyrmion
Meh.. använd inte loopar i matlab

Detta är omkring 200 ggr snabbare:
Kod:
A=[3x5 matris];

komb = zeros(size(A));
A_tmp = [A(1,:);A(2,:);A(2,:);A(3,:);A(3,:)];

[svar,index] = max(sum(A_tmp(sub2ind(size(A_tmp),perms(1:5),repmat(1:5,120,1))),2));

svar
komb(sub2ind(size(A),[1,2,2,3,3],rows(index,:))) = 1

Men du får själv lista ut vad jag gör

Jag gillar loopar Fast din kod var helt klart snyggare. Ska ta och lägga den där sub2ind-funktionen på minnet, den kan nog komma till användning någon gång.
Citera
2015-07-09, 00:38
  #7
Medlem
Skyrmions avatar
Citat:
Ursprungligen postat av El-Duderino
Jag gillar loopar Fast din kod var helt klart snyggare. Ska ta och lägga den där sub2ind-funktionen på minnet, den kan nog komma till användning någon gång.

Loopar gör det förvisso lättläsligt och mer pedagogiskt, men matlab är som bäst om du kan få till en mer vektoriserad lösning. Om allt man ska göra är en massa loopar är det bättre med C eller Fortran. Fast i detta fallet var inte hastigheten något direkt problem, så det är inget fel på dina loopar.. Men om matrisen hade varit mycket större hade det så klart kunnat bli kännbart

Det borde förresten gå att göra det ytterligare lite bättre. I min kod räknar jag med samtliga 120 permutationer av '1 2 3 4 5', som ska svara emot raderna i min 5x5 matris, men det är endast 30 permutationer som är av intresse tack vare att 2 värden ska tas ifrån rad 2 och 2 värden ifrån rad 3 i 3x5 matrisen. Så det är ju egentligen samtliga, unika, permutationer av '1 2 2 3 3' som vi är ute efter. Kunde tyvärr inte komma på något snabbt sätt att få ut detta, så valde därför att skapa just 5x5 matrisen.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in