Matlab, få svaret i vektorform?

Permalänk
Medlem

Matlab, få svaret i vektorform?

Tjo!

Har just påbörjat civilingenjörsutbildning och en del av vår matteundervisning är i Matlab. Som bekant finns det en funktion inbyggd som heter cross, och som ger kryssprodukten av två vektorer. Vi ska nu som övning programmera en funktion som fungerar på samma sätt. Saken är då den att jag är HELT blåst på det här, och resten av klassen är inte så mycket bättre.

Problemet är nämligen det att jag inte kan få svaret på det hela i vektorform. Vi ska räkna ut kryssprodukten av u = i och v = j. Sätter därför u=[1,0,0] och v=[0,1,0] i matlab, och kör sedan kryss(u,v). Kryssfunktionen ser ut som följer:

function w=kryss(u,v)
% Cross product of the vector u and v
%
%Syntax: w=kryss(u,v)
%
%Input: u,v - two 1x3 vectors
%Output: s - a scalar

w=(u(2)*v(3)-u(3)*v(2))+(u(3)*v(1)-u(1)*v(3))+(u(1)*v(2)-u(2)*v(1))

Genom det får jag svaret 1. Vilket stämmer, men man får inte veta om den motsvarar i, j eller k.

cross(u,v) ger svaret 0 0 1, vilket är den formen jag vill ha svaret i.

Så, vill någon vänlig själ berätta hur det ska gå till?

Tack på förhand!

Visa signatur

CyberpowerPC Tracer III EVO: i7-9750H | GTX 1660 Ti | 16GB | 1250GB SSD

Permalänk

Anledningen till att du inte får ut en vektor beror på att du inte har löst uppgiften. Fundera på hur du skulle löst uppgiften på papper.

Permalänk
Medlem

Hm, kan iofs vara troligt... Well, på papper hade jag ju skrivit in

w=(u(2)*v(3)-u(3)*v(2))i+(u(3)*v(1)-u(1)*v(3))j+(u(1)*v(2)-u(2)*v(1))k

och i det här fallet fått ut svaret k. Hur jag ska skriva det i Matlab vettesatan, måttligt bristfällig info från våra kära lärares sida angående programeländet...

Visa signatur

CyberpowerPC Tracer III EVO: i7-9750H | GTX 1660 Ti | 16GB | 1250GB SSD

Permalänk
Hedersmedlem

Jag tror att han har tänkt rätt, han grupperar till exempel komponenterna med parenteser. Felet är snarare att man inte skriver dem som en vektor, ett tips är att fundera på hur man gjorde för att skapa de vektorer som används som indata. Det är ett mindre fel än man kan tro, i alla fall om man ser till antalet tecken...

Permalänk
Medlem

Ja, jo... Alltså, jag har inga problem med att lösa skiten på papper, det går som smort, men när det här programeländet ska blandas in blir jag helt förblindad...

Visa signatur

CyberpowerPC Tracer III EVO: i7-9750H | GTX 1660 Ti | 16GB | 1250GB SSD

Permalänk
Hedersmedlem

Du skrev ju till exempel inte u = 1i + 0j + 0k och inte heller u = (1) + (0) + (0)

Permalänk
Medlem

Grejen är att man inte ska det. u=[0, 0, 1] ska göra att programmet automatiskt ser det som en vektor. Har det påståtts i vilket fall. Och i och j kan man inte använda rakt av, då de är definerade som komplexa tal.

Visa signatur

CyberpowerPC Tracer III EVO: i7-9750H | GTX 1660 Ti | 16GB | 1250GB SSD

Permalänk
Citat:

Ursprungligen inskrivet av Elgot
Jag tror att han har tänkt rätt, han grupperar till exempel komponenterna med parenteser. Felet är snarare att man inte skriver dem som en vektor, ett tips är att fundera på hur man gjorde för att skapa de vektorer som används som indata. Det är ett mindre fel än man kan tro, i alla fall om man ser till antalet tecken...

Såg det sen efter. Var väl lite för snabb.

a = 1;
b = 2;
c = [a b]; ger vektorn [1 2].

Edit:
c(1) ger svaret 1 och det är ingen vektor.

Edit 2:
c(3) = 4 gör att c innehåller vektorn [1 2 4]

Edit 3:
d = c(3) + c(1) är samma som att skriva d = 4 + 1 och ger svaret 5

Permalänk
Medlem

SEGER!

Hittade problemeländet... Så här ser den fungerande ut:

function w=kryss(u,v)
% Cross product of the vector u and v
%
%Syntax: w=kryss(u,v)
%
%Input: u,v - two 1x3 vectors
%Output: w - a vector

w= [ (u(2)*v(3)-u(3)*v(2)); (u(3)*v(1)-u(1)*v(3)); (u(1)*v(2)-u(2)*v(1)) ]

Tack för att ni tog er tid!

Edit: Hm, det där såg också ut som en intressant grej, ska sätta mig och experimentera lite...

Visa signatur

CyberpowerPC Tracer III EVO: i7-9750H | GTX 1660 Ti | 16GB | 1250GB SSD

Permalänk

Byt ut ; mot , eller mellanslag så blir det bättre

Permalänk
Medlem

Aa, det är en smaksak, med ; får man dom i kolumnuppställning istället, det påverkar i vilket fall inte resultatet... Men tack!

Visa signatur

CyberpowerPC Tracer III EVO: i7-9750H | GTX 1660 Ti | 16GB | 1250GB SSD

Permalänk
Citat:

Ursprungligen inskrivet av Choffe
Aa, det är en smaksak, med ; får man dom i kolumnuppställning istället, det påverkar i vilket fall inte resultatet... Men tack!

Smaksak?

Testa med u'*v och u*v så ska du se att det blir skillnad

Permalänk
Medlem

Nu ska det erkännas att jag inte är helt med på vad du menar...

Visa signatur

CyberpowerPC Tracer III EVO: i7-9750H | GTX 1660 Ti | 16GB | 1250GB SSD

Permalänk

Det är bäst att vara konsekvent och ha samma dimension på både indata som på utdata.

Det går inte heller att kombinera olika dimensioner hur som helst. Det var det jag ville visa med det sista exemplet.

Med u=[1,0,0];, v=[0,1,0]; ger
u'*v matrisen [0 1 0; 0 0 0; 0 0 0]
medan u*v ger
??? Error using ==> mtimes
Inner matrix dimensions must agree.

Permalänk
Medlem

Ahaaaa... Då förstår jag! Tack! Herrejösses, det här kommer ge mig gråa hår... Risken finns för fler trådar angående det här programmet... Men stort tack så länge!

Visa signatur

CyberpowerPC Tracer III EVO: i7-9750H | GTX 1660 Ti | 16GB | 1250GB SSD

Permalänk

Har själv varit i samma sits. Det tar ett tag innan man kommer igång.

Permalänk
Medlem

Kanske ska starta en officiell matlab-tråd...

Jag vill bara flika in en liten kommentar angående prestanda.
De färdigskrivna funktionerna i Matlab är ju helt fantastiska för att få något att fungera snabbt. MEN många (långt ifrån alla) funktioner har en massa kod för att vara generiska, hantera fel m.m. detta slöar ner något otroligt.

Kika bara på kryssprodukts-exemplet
om man gör 1 000 000 kryssprodukter med matlabs funktion så tar det upp emot 62 sekunder (i alla fall på min burk)
samtidigt så tar samma sak ca 3 till 4 sekunder med den nedskalade funktionen som Choffe skrev.

Tänk på detta då det börjar bli dags att optimera större skapelser,
då ni vet att programmet fungerar och fyller alla specifikationer så kan ni gå in i de färdigskrivna matlabfunktionerna och se hur de är implementerade och se om ni kan ta bort kod för felhantering, generalisering m.m.
Tro mig, det kan kapa rejält med tid!

Glöm inte bort att använda den medföljande profilern som finns under Desktop för att kunna spåra vart tiden spenderas ....

Men främst av allt, se till att ha kul med Matlab

Visa signatur

weeeee

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av mounte
Kanske ska starta en officiell matlab-tråd...

JA TACK!

Visa signatur

I like my women how i like my coffee... In a plastic cup.