#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?