Katt i en matris
God morgon!
Jag tänkte fråga men jag blev disträ av:
Men men!
Jag har följande problem i matlab, som måste lösas med så få rad som möjligt.
Jag kom inte på något smart sätt att kombinera punkter för att förminska raden. (Man tänker till exempel att det vore säkert möjligt att skapa svansen med x = m, y = n, och skriva den som en serien av m-1:n+1?)
Min lösning är ganska lång och tråkigt.
Hur kan jag förtrycka den i en kortare och smidigare lösning?
% matrix
A = zeros(16,16);% ears
A(5,7) = 1;
A(5,10) = 1;%head
A(6, 7:10) = 1;
A(7:9, 6) = 1;
A(7:9, 11) = 1;A(8, 8:9) = 1;
A(10, 7:10) = 1;%body
A(11, 8:9) = 1;A(12, 7) = 1;
A(12, 10) = 1;A(13, 6) = 1;
A(13, 11) = 1;A(14, 5:12) = 1;
%tail
A(12, 12) = 1;
A(11, 13) = 1;
A(10, 14) = 1;
A(9, 15) = 1;
dajamanté skrev:God morgon!
Jag tänkte fråga men jag blev disträ av:
Men men!
Jag har följande problem i matlab, som måste lösas med så få rad som möjligt.
Jag kom inte på något smart sätt att kombinera punkter för att förminska raden. (Man tänker till exempel att det vore säkert möjligt att skapa svansen med x = m, y = n, och skriva den som en serien av m-1:n+1?)
Min lösning är ganska lång och tråkigt.
Hur kan jag förtrycka den i en kortare och smidigare lösning?
% matrix
A = zeros(16,16);% ears
A(5,7) = 1;
A(5,10) = 1;%head
A(6, 7:10) = 1;
A(7:9, 6) = 1;
A(7:9, 11) = 1;A(8, 8:9) = 1;
A(10, 7:10) = 1;%body
A(11, 8:9) = 1;A(12, 7) = 1;
A(12, 10) = 1;A(13, 6) = 1;
A(13, 11) = 1;A(14, 5:12) = 1;
%tail
A(12, 12) = 1;
A(11, 13) = 1;
A(10, 14) = 1;
A(9, 15) = 1;
Jag kan inte Matlab, men kan du utnyttja symmetrin, bara rita halva matrisen och sedan spegla den?
Hmm bra idé!
Men jag kan inte tillräckligt matlabs heller 😖
Spegling höger-vänster kan göras med funktionen
fliprl(A)
(spegling upp-ner flipud(A))
Om A är den vänstra delen av katten så får du hela katten utom svansen som
A = A + fliprl(A);
Sedan får svansen läggas till.
EDIT: Det ska vara fliplr(A)
Svansen kan t.ex läggas till som
A(9:12,12:15)=fliplr(eye(4))
Tack Doktor och Yngve. Jag provar det.
Du kanske kan använda funktionen "cat".
(Skojar, den finns, men den gör nog ingen nytta här.)
Haha, en poäng för att du lurade mig så bra :)
Det borde ju gå att manuellt representera katten i något enradsformat och sedan konvertera det till matrisformatet via någon foorloop.
Exempelvis en sekvens
70 vita, 1 svart, 2 vita, 1 svart, 12 vita, 4 svarta, 11 vita, 1 svart, 4 vita, 1 svart, 10 vita... osv (orden kan exkluderas)
Dvs antalet vita och svarta man stöter på i följd när man läser figuren från vänster till höger, uppifrån och ned, och sedan går en algoritm igenom pixel för pixel på detta sätt.
Man sparar några rader av kod även om det blir ett ganska konstigt sätt att lagra datan och är främst en marginel fördel.
Det effektivaste sättet är dhock nog bildigenkänning där man matar bildfilen till programmet och låter den göra en matris av pixlarna.
Sedan kan man säkert skriva någon 4 raders conway-automata som genererar bilden men det är mest en kul idé än något man kan göra.