8 svar
391 visningar
dajamanté 5139 – Fd. Medlem
Postad: 21 mar 2019 06:52

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 40273 – Livehjälpare
Postad: 21 mar 2019 08:15 Redigerad: 21 mar 2019 08:16
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é 5139 – Fd. Medlem
Postad: 21 mar 2019 20:05

Hmm bra idé!

Men jag kan inte tillräckligt matlabs heller 😖

Dr. G 9479
Postad: 21 mar 2019 20:29 Redigerad: 21 mar 2019 20:40

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é 5139 – Fd. Medlem
Postad: 22 mar 2019 07:49

Tack Doktor och Yngve. Jag provar det.

Laguna Online 30455
Postad: 22 mar 2019 09:01

Du kanske kan använda funktionen "cat".

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

dajamanté 5139 – Fd. Medlem
Postad: 28 mar 2019 21:11

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

SeriousCephalopod 2696
Postad: 29 mar 2019 01:03 Redigerad: 29 mar 2019 01:04

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 2696
Postad: 29 mar 2019 01:06

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
Close