2017-09-15 120 views
5

Piszę skrypt Matlab, w którym mam kilka obiektów o tej samej zdefiniowanej przez siebie klasie, na przykład A, B i C. Następnie mam funkcję, która działa na dowolnym z 2 obiektów, takich jak func(A,B).Jak utworzyć tablicę wskaźników do obiektów w Matlab?

Teraz chcę wybrać obiekt, na przykład A, a następnie func(A,x) przez wszystkie pozostałe obiekty. Zasadniczo uzyskaj coś takiego:

func(A,B) 
func(A,C) 
A.update() 

func(B,A) 
func(B,C) 
B.update() 

... 

Potrzebuję utworzyć tablicę wszystkich obiektów, przez które mogę przechodzić, a jednocześnie oczywiście wyłączyć. Próbowałem to zrobić z macierzy komórkowej, tak mam:

AllObjs = {A,B,C} 
for i=1:length(AllObjs) 
    if ~isequal(A, AllObjs{i}) 
    func(A, AllObjs{i}) 
    end 
end 
A.update() 

Jednak gdy A jest zaktualizowane, zostanie A w AllObjs nie pobierać aktualizacje. Tak więc dla następnej pętli muszę stworzyć nową tablicę wszystkich obiektów. Jest to wykonalne w tym prostym przykładzie, ale nie można nim zarządzać, gdy obiekty są aktualizowane w innym miejscu. Chciałbym mieć szereg wskaźników do wszystkich obiektów. Moja wyszukiwarka Google mówi mi, że w Matlabie nie ma wskaźnika, ale czy jest jakiś sposób, aby osiągnąć to, co chcę tutaj zrobić?

Odpowiedz

4

Podejrzewam (jest to trudne bez zobaczenia twojego kodu) twoje klasy A, B & C nie dziedziczą z uchwytu.

Weźmy przykłady poniżej:

classdef noHandle 
    properties 
    name = ''; 
    end 
    methods 
    function obj = noHandle (name) 
     obj.name = name; 
    end 
    end 
end 

A = noHandle ('A'); 
B = noHandle ('B'); 
C = noHandle ('C'); 
allObjs = { A B C } 
allObjs{1}.name % check its name is "A" 
% change the name of A 
A.name = 'AAA' 
allObjs{1}.name % see that allObjs{1} is still A. 

Jeśli jednak zrobić:

classdef fromHandle < handle 
    properties 
    name = ''; 
    end 
    methods 
    function obj = fromHandle (name) 
     obj.name = name; 
    end 
    end 
end 

Następnie wykonaj:

A = fromHandle ('A'); 
B = fromHandle ('B'); 
C = fromHandle ('C'); 
allObjs = { A B C } 
allObjs{1}.name % check its name is "A" 
% change the name of A 
A.name = 'AAA' 
allObjs{1}.name % see that allObjs{1} is updated to AAA. 
+0

Nie moja klasa nie posiada 'handle'. Czy są jakieś dokumenty na temat tego, co robi? – LWZ

+1

W dokumentach matlab jest dużo i zobacz https://stackoverflow.com/q/6436539/4196396 – matlabgui