/ / Pokročilé priradenie dolného indexu, aby sa zabránilo slučke for v MATLABe-veľa binárnych operácií naraz-matlab, for-loop, binárne operátory

Pokročilé priradenie indexov, aby sa zabránilo cyklu pre použitie v MATLAB - mnoho binárnych operácií naraz - matlab, for-loop, binárne operátory

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ď č. 1

arrayfun 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)).