8 svar
121 visningar
dajamanté 5246
Postad: 21 mar 2019

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;

Yngve 11609 – Mattecentrum-volontär
Postad: 21 mar 2019 Redigerad: 21 mar 2019
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?

dajamanté 5246
Postad: 21 mar 2019

Hmm bra idé!

Men jag kan inte tillräckligt matlabs heller 😖

Dr. G 4396
Postad: 21 mar 2019 Redigerad: 21 mar 2019

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

dajamanté 5246
Postad: 22 mar 2019

Tack Doktor och Yngve. Jag provar det.

Laguna 4970
Postad: 22 mar 2019

Du kanske kan använda funktionen "cat".

(Skojar, den finns, men den gör nog ingen nytta här.)

dajamanté 5246
Postad: 28 mar 2019

Haha, en poäng för att du lurade mig så bra :)

SeriousCephalopod 1775
Postad: 29 mar 2019 Redigerad: 29 mar 2019

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.

SeriousCephalopod 1775
Postad: 29 mar 2019

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.

Svara Avbryt
Close