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.
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.
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.
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
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.
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.