Więc zastanawiam się o tym od dłuższego czasu. Reasumując nad jakimś tablicy zmiennej A
jest tak proste jakMATLAB suma wszystkich elementów tablicy wycenione wyrażenie
sum(A(:))
% or
sum(...sum(sum(A,n),n-2)...,1) % where n is the dimension of A
Jednak gdy dojdzie do wyrażeniami (:)
już nie działa, jak
sum((A-2*A)(:))
ma prawidłowej składni Matlab, zamiast musimy napisz
foo = A-2*A;
sum(foo(:))
%or the one liner
sum(sum(...sum(A-2*A,n)...,2),1) % n is the dimension of A
Powyższy liner będzie działał tylko wtedy, gdy wymiar A jest ustalony, co w zależności od tego, co robisz, może nie być konieczne być w tym przypadku. Wadą tych dwóch linii jest to, że foo będzie przechowywane w pamięci aż do uruchomienia clear foo
lub może nie być nawet możliwe w zależności od rozmiaru A i tego, co jeszcze jest w twoim obszarze roboczym.
Czy istnieje ogólny sposób na obejście tego problemu i zsumowanie wszystkich elementów wyrażenia wycenianego w tablicy w jednym wierszu/bez tworzenia zmiennych czasowych? Coś takiego jak sum(A-2*A,'-all')
?
Edit: differes to z How can I index a MATLAB array returned by a function without first assigning it to a local variable?, gdyż nie dotyczy ogólnie (ani specyficzne) indeksowanie tablicy wyceniane wyrazu lub zwrotu wartości, ale raczej podsumowanie nad każdym możliwym indeksu.
Choć możliwe jest rozwiązanie mojego problemu z odpowiedzią podaną w linku, gnovice mówi, że używanie subref
jest raczej brzydkim rozwiązaniem. Dalej Andras Deak zamieścił o wiele czystszy sposób robienia tego w komentarzach poniżej.
Dlaczego tak bardzo chcesz uniknąć zmiennej tymczasowej? Nie ma to większego znaczenia z punktu widzenia szybkości, a także żadnego z punktu widzenia pamięci RAM (ta sama zmienna byłaby mimo wszystko tworzona w wywołaniu "sum"). Powiedziałbym, że 'suma (sum()) może być szybsza, ponieważ przekształcenie dużych macierzy zajmuje dużo czasu. – Adriaan
@Daniel Wierzę, że istnieje prosta odpowiedź na to pytanie, która nie dotyczy duplikatu: 'sum (reshape (A-2 * A, 1, []))'. Ponownie otwórz, jeśli się zgodzisz, abym mógł odpowiedzieć. –
@AndrasDeak Obie wersje działają, ale twoja wygląda o wiele czystsza niż przy użyciu 'subref'. Czy warto w tym przypadku ponownie otworzyć pytanie? (Nie mam pewności co do właściwego kodeksu postępowania tutaj.) –