Matlab — класс, к которому можно добавлять разные «элементы»

#matlab #function #class

#matlab #функция #класс

Вопрос:

Как бы я мог сделать (например) что-то вроде этого:

 house = Building('blue'); % creates an object representing a 'blue' house 
                          % based on a class called building

room1 = Room('kitchen', 9);  % creates a room object representing a kitchen
                             %  with a size of 9 m^2  
room2 = Room('lobby', 5);    % creates a room object representing the lobby
                             %  with a size of 5 m^2  

house.add_room(room1);    % assigns the two rooms to the house object
house.add_room(room2);    %

house.room_count();       % should return the number 2
house.size('kitchen');    % should return the size of the kitchen, i.e. 9
house.size();             % should return the size of the entire house, i.e. 14
house.room_list();        % should return a list of the rooms in the house
                          %  which could e.g. be the string 'kitchen lobby'
  

Этот пример полностью теоретический, и мне только интересно, как можно реализовать что-то подобное в Matlab, чтобы увидеть, как работает язык. Я был бы благодарен за любую помощь.

Мое образование связано с более «рудиментарным» языком C , но я хочу изучить Matlab. Однако, похоже, я не могу найти никаких полезных примеров кода, объясняющих подобные вещи; отсюда и этот вопрос.

Ответ №1:

Если ваше образование связано с C , то вы должны быть знакомы с концепцией классов и объектов.

Вот краткий пример реализации некоторых ваших разработок:

Room.m

 classdef Room < handle
    properties
        name
        area
    end
    methods
        function obj = Room(name, a)
            if nargin < 2, a = 1; end
            obj.name = name;
            obj.area = a;
        end
    end
end
  

Building.m

 classdef Building < handle
    properties
        color
        rooms
    end
    methods
        function obj = Building(clr)
            obj.color = clr;
            obj.rooms = Room.empty(1,0);
        end

        function add_room(obj, r)
            if ~isa(r, 'Room'), return, end
            obj.rooms(end 1) = r;
        end

        function num = room_count(obj)
            num = numel(obj.rooms);
        end

        function list = room_list(obj)
            list = {obj.rooms.name};
        end

        function sz = area(obj)
            sz = 0;
            for i=1:numel(obj.rooms)
                sz = sz   obj.rooms(i).area;
            end
        end
    end
end
  

Теперь мы можем создавать объекты, подобные вашим:

 house = Building('blue');
house.add_room(Room('kitchen',9));
house.add_room(Room('lobby',5));
house.room_count()
house.room_list()
house.area()
  

Комментарии:

1. MATLAB имеет обширную документацию по объектно-ориентированному программированию, поэтому я просто укажу вам на документы для получения дополнительной информации: mathworks.com/help/matlab/object-oriented-programming.html , mathworks.com/discovery/object-oriented-programming.html

2. Это именно то, что я искал, спасибо! И да, я просмотрел ваши ссылки, но они на самом деле не объясняют вещи подробно. И, возможно, один последующий вопрос. Что, если бы у меня был класс суперкласса с именем house_part и производные классы, такие как room (т.е. classdef room < house_part) и pipe (classdef pipe < house_part).). Как бы я мог добавить их в дом? Я предполагаю, что дому понадобится свойство, подобное parts , в классе Building , и мне нужно было бы инициализировать obj.parts = house_part.empty(1,0); в конструкторе? Я пытаюсь это сделать, но это не работает. :/

3. на самом деле все, что вам нужно, описано в документах (метод empty() , массив объектов , наследование , разнородные массивы и многое другое ..). Я предлагаю вам сначала просмотреть документы, прочитать эти темы и, если у вас возникли какие-либо вопросы, создать новые сообщения.. Удачи

4. Я решил проблему с массивами ячеек: mathworks.co.uk/help/matlab/matlab_prog /…

5. да, это определенно проще 🙂 cell-array — это обычные контейнеры, которые могут хранить любой тип.

Ответ №2:

Я не уверен, что это полностью соответствовало бы всем вашим требованиям, но вы пробовали поиграть с классом structure?

http://www.mathworks.co.uk/help/matlab/ref/struct.html