Mám veľké pole, povedzme A, s hodnotami v {1, ..., n}, a ďalšie pole B rovnakej veľkosti.
Chcem získať všetky tieto položky:
B(A==1)
B(A==2)
...
B(A==n)
a potom urobte s výsledkami niečo iné (zatiaľ nie je také dôležité).
Vyskúšal som veci ako:
[x,y] = B(A==[1:n])
a
[x,y] = [B(A==1), B(A==2), ..., B(A==n)]
Samozrejme, že bezvýsledne.
Prístup pre slučku
for ii=1:n
dummy=B(A==1)
other stuff
end
funguje, ale som presvedčený, že sa môžem vyhnúť slučkám pre všetko v MATLABe! Ale uviazli ste tu. Nejaké návrhy? Možno nejaký druh vloženého anonymného volania funkcií?
odpovede:
2 pre odpoveď č. 1arrayfun
je váš priateľ pre takéto veci, dúfajme, že uvidíte, ako to upraviť pre vlastné použitie:
A=randi(5,10,10)
B=rand(10)
C=arrayfun(@(i) B(A==i),1:5,"UniformOutput",false)
C{1} % for example, gives B(A==1)
C
je bunkové pole.
Pozor na to for
slučka môže byť pri väčších problémoch rýchlejšia. Bolo by vhodné urobiť niekoľko testov, aby ste zistili, či arrayfun
je vlastne rýchlejší. Pozri na táto otázka a jeho odpovede, aby ste sa o tom dozvedeli viac. Existuje nejaký spôsob, ako to urobiť bez použitia arrayfun
, ale nemôžem na to myslieť!
1 pre odpoveď č. 2
Za predpokladu, A
aby ste boli vektorovým poľom, môžete vytvoriť binárnu maticu porovnávaní pre každý prvok v A s vektorom [1: n], kde n je maximálny prvok v A -
indx_mat = bsxfun(@eq,A,1:max(A))
Ďalej, kedykoľvek budete potrebovať prístup k niektorým prvkom v B na základe porovnaní, môžete použiť konkrétne stĺpce v indx_mat
namiesto. Napríklad, ak potrebujete prístup k prvkom pre B(A==2)
, použitie B(indx_mat(:,2))
.