Как инициализировать вектор дескрипторов класса? - PullRequest
3 голосов
/ 24 октября 2011

У меня есть класс на основе дескриптора, который мне нужен для создания вектора. Простой способ сделать это - динамически построить вектор в цикле for, но это заставляет mlint жаловаться на изменение размера вектора.

classdef HandleClass < handle
    ...
end

...

for i = 1:10
    foo(i) = HandleClass();
end

Я с подозрением отношусь к попаданию ресурса, необходимому для использования этого метода для выделения больших массивов сложных объектов.

Комментарий в предыдущей теме описывает полезный метод создания вектора с использованием функции repmat . Тем не менее, @gnovice предупредил, что при этом будет создан вектор маркеров, указывающих на один и тот же объект. Я проверил это, и, похоже, это так.

Есть ли хитрость, позволяющая предварительно выделять вектор объектов уникальных дескрипторов без использования для цикла?


Краткое изложение решения

Решение , представленное SCFrench , правильно выделяет память для создания вектора объектов. Другие решения будут создавать вектор, но не будут выделять память.

foo(10) = HandleClass();

Ответы [ 3 ]

4 голосов
/ 24 октября 2011

Кажется, вы можете сделать это путем вызова метода empty, который присутствует во всех неабстрактных классах.

foo = HandleClass.empty(10,0);
for i = 1:10
    foo(i) = HandleClass();
end
2 голосов
/ 24 октября 2011
foo(10) = HandleClass();

Это будет заполнение по умолчанию от foo (1) до foo (9).

Обратите внимание, что это работает только в том случае, если конструктор HandleClass работает без входных аргументов (то есть он может быть создан по умолчанию).

0 голосов
/ 05 ноября 2015

Имея конструктор по умолчанию, принятый ответ хорошо. Отсутствие конструктора по умолчанию (HandleClass()) возвращает недостаточно входных аргументов) лучшая возможность, которую я вижу, - сначала создать ячейку:

foo=cell(1,10);
for ix=1:10
    foo{ix}=HandleClass(ix)
end;
foo=[foo{:}];
...