Springen naar inhoud

Kan matlab dit aan?


  • Log in om te kunnen reageren

#1

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 19 februari 2010 - 00:40

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
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
document.write
, maar dan voor Matlab...
Alvast bedankt!
"C++ : Where friends have access to your private members." — Gavin Russell Baker.

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 19 februari 2010 - 07:59

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.

ismember(x,M);

#3

Tommeke14

    Tommeke14


  • >250 berichten
  • 771 berichten
  • Ervaren gebruiker

Geplaatst op 19 februari 2010 - 09:46

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

#4

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 19 februari 2010 - 16:29

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.

Veranderd door In fysics I trust, 19 februari 2010 - 16:30

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

#5

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 19 februari 2010 - 22:56

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:
ndims(A)

of als je direct een vector met de lengtes in elke dimensie wilt weten:
v= size(A)

waarbij
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

#6

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 20 februari 2010 - 10:57

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?

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.

#7

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 20 februari 2010 - 11:51

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

Bijvoorbeeld (uit het hoofd, niet getest):

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

#8

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 20 februari 2010 - 12:17

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.

#9

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 20 februari 2010 - 12:54

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

#10

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 20 februari 2010 - 16:09

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?

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!

Veranderd door In fysics I trust, 20 februari 2010 - 16:10

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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures