Kan matlab dit aan?

Moderators: dirkwb, Xilvo

Forumregels
(Middelbare) school-achtige vragen naar het forum "Huiswerk en Practica" a.u.b.
Zie eerst de Huiswerkbijsluiter
Reageer
Gebruikersavatar
Berichten: 7.390

Kan matlab dit aan?

Hoi, ik heb een beetje zitten experimenteren met MatLab, en daarbij een eenvoudig progje geschreven dat nagaat of een bepaalde x in een bepaalde matrix M zit.

Niks moeilijk aan, maar nu vraag ik me af of je dit kan uitbreiden naar n-dimensionale matrices.

Dus veronderstel dat je een matrix hebt gegenereerd met dimensie n via

Code: Selecteer alles

rand
of zo.



Als je dan je functie oproept die als input een reëel getal heeft en een matrix, dus in dit geval de matrix van dimensie n, dan is het niet moeilijk om de dimensie te laten zoeken.

Dan komt het moeilijke gedeelte: je wil dat er n for lussen opgeroepen worden om de matrix te doorlopen, om na te gaan of het element in de matrix zit.

Is dit mogelijk via Matlab?

Ik hoop dat mijn probleem een beetje duidelijk is... Ik zoek zoiets als

Code: Selecteer alles

document.write
, maar dan voor Matlab...

Alvast bedankt!
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Berichten: 7.068

Re: Kan matlab dit aan?

Hoi, ik heb een beetje zitten experimenteren met MatLab, en daarbij een eenvoudig progje geschreven dat nagaat of een bepaalde x in een bepaalde matrix M zit.

Code: Selecteer alles

ismember(x,M);

Berichten: 771

Re: Kan matlab dit aan?

Volgens mij is het wel mogelijk, ik zie toch geen praktisch probleem...

Je kan toch gewoon je for lus binnen een andere for lus zetten, en dan is het probleem opgelost

ismember lukt ook, maar dan heb je natuurlijk geen programmeeroefening gedaan, en daar gaat het hem hier om volgens mij

Gebruikersavatar
Berichten: 7.390

Re: Kan matlab dit aan?

Ok, maar als de dimensie van de matrix door het programma zelf moet bepaald worden, weet je niet hoeveel keer de for moet geschreven worden, dat is mijn probleem...

Mss ter verduidelijking, ik bedoel een eerder een n-dimensionale array, ipv een matrix.
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Gebruikersavatar
Berichten: 7.224

Re: Kan matlab dit aan?

Ok, maar als de dimensie van de matrix door het programma zelf moet bepaald worden, weet je niet hoeveel keer de for moet geschreven worden, dat is mijn probleem...


in matlab:

Code: Selecteer alles

ndims(A)


of als je direct een vector met de lengtes in elke dimensie wilt weten:

Code: Selecteer alles

v= size(A)


waarbij

Code: Selecteer alles

length(v) == ndims(A)

Mss ter verduidelijking, ik bedoel een eerder een n-dimensionale array, ipv een matrix.
Een matrix is een bijzonder geval van een n-dimensionale array (of tensor als je de wiskundige term ervoor wilt gebruiken).
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

Gebruikersavatar
Berichten: 7.390

Re: Kan matlab dit aan?

Het is inderdaad bedoeld als oefening, maar in ieder geval bedankt voor de reacties!

Stel dus dat ik het toch wil proberen met recursie (puur voor de oefening)

in matlab:

CODE ndims(A)

CODE v= size(A)

waarbij

CODE length(v) == ndims(A)

Ik had dat laatste gebruikt.

Eens je weet wat het aantal dimensies is, moet je de for-lus n keer binnen elkaar oproepen. Dat kan dan met een while veronderstel ik?

Code: Selecteer alles

while(i<n)

for j=1:v(1,n)

if x==M(.........)

end

end

end
Hoe kan je depositie in zo'n tensor dan bekijken?

Ik bedoel: de code schrijf je op voorhand, voor het algemene geval van n dimensies, maar om een waarde uit zo'n tensor te vergelijken met de gezochte waarde, moet je M toch expliciet n argumenten meegeven, terwijl je, op het moment van schrijven niet weet welke dimensie de tensor zal hebben.

M.a.w., het programma zal een variabel aantal argumenten moeten geven aan M(....). Met Javascript kan je dat doen met en voorwaardelijke lus, en dan binnen de haakjes n keer het write-statement gebruiken. Als ik zoiets vind voor matlab, is het probeem opgelost, mar is dat laatste ook mogelijk?

Nogmaals bedankt!
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Gebruikersavatar
Berichten: 7.224

Re: Kan matlab dit aan?

je hebt recursieve functies nodig om dit voor elkaar te krijgen.

Bijvoorbeeld (uit het hoofd, niet getest):

Code: Selecteer alles

function x = test(A)

% A is de n-dimensionale matrix

% Als A een scalar is kunnen we iets met dit element doen

if isscalar(A)

   % dosomething

   x = .....;

   return;

end

% totaal aantal dimensies van A

n = ndims(A);

% aantal elementen in de laatste dimensie

m = ndims(end);

% loop door deze elementen heen

for k = 1 : m

% Maak de matrix 1 dimensie kleiner met het geselecteerde element

c(1:n-1)={':'};

B = A(c{:}, m);

% Roep deze functie recursief aan, maar nu met de n-1 matrix

x = test(B);

end
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

Gebruikersavatar
Berichten: 7.390

Re: Kan matlab dit aan?

De dimensie telkens ééntje verkleinen is een erg goede vondst!

Hoe zou u dan nagaan of dat element aanwezig is? Is het dan niet nodig om iets te gebruiken zoals A(x,y,z,w,...t) om het element op die positie op te roepen?

Nogmaals bedankt!
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Gebruikersavatar
Berichten: 7.224

Re: Kan matlab dit aan?

Stel ik heb een k x m x n tensor (array). Nu kies ik een willekeurig getal voor de laatste index (bijv n = 2). De tensor die ik dan overhoud is de k x m matrix die hoort bij de element n = 2.

Dit truukje kan ik natuurlijk nog een keer doen op deze k x m matrix. Neem een waarde voor (m = 3) en je houd een vector met lengte k over. Kies je ook een waarde voor k (bijv k = 5), dan houd je een scalar over. Deze scalar is het element (5, 3, 2) in de gegeven tensor. Deze scalar kun je dan bijvoorbeeld met een ander getal vergelijken.

Als je de waardes van k, m en n niet willekeurig kiest, maar bepaald mbv een for-loop, bekijk je uiteindelijk alle elementen in de tensor. Een groot nadeel van deze methode is dat het veel rekenwerk kost. Matlab functies "ismember" of "find" zijn veel sneller.
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

Gebruikersavatar
Berichten: 7.390

Re: Kan matlab dit aan?

Dat begrijp ik.
Stel ik heb een k x m x n tensor (array).
OK, maar hier ga vanuit dat je dimensie 3 hebt, waardoor hetvanzelfsprekend is dat je voor elke dimensie een for-lus neemt die een dimensie voor zijn rekening neemt.

Stel dat je een tensor/array hebt van een dimensie die je a priori niet kent, en je laat je functie hierop los. Dan kan je perfect bepalen wat de dimensie is met je functie.

Maar dan moet je die for-lussen oproepen, namelijk n for-lussen. n keer een lus laten schrijven, kan ik dan verwezenlijken met een while: while (j<n+1), en de for-lus hierbinnen.

Op die manier overloop je elk element uit de tensor, zoals u aanduidde.

Rest nog het vergelijken met een bepaalde waarde, die ook als argument aan de functie wordt meegegeven (bv. met input). En het is hier dat mijn probleem zit: hoe vergelijk ik de waarde op en bepaalde positie in de tensor met de gezochte waarde x? Dus hoe luidt de syntax om de vergelijking uit te voeren tussen x en het element op een bepaalde positie? Dus hoe vul je de volgende regel in het programma aan, hoe vervang je wat er in de volgende regel tussen vierkante haakjes staat?

Code: Selecteer alles

if x==....[element op een bepaalde positie in een tensor waarvan we de dimensie a priori niet kennen]....
Natuurlijk zijn de ismember etc. veel sneller, maar het gaat om het idee, om de oefening...

Nogmaals bedankt!
"C++ : Where friends have access to your private members." Gavin Russell Baker.

Reageer