Matrix/Array of Objects vs. Class Constructor

10 Ansichten (letzte 30 Tage)
Khanh
Khanh am 30 Sep. 2014
Bearbeitet: Khanh am 10 Okt. 2014
Let say I have a class Foo
classdef Foo
function obj = Foo(x,y)
% constructor's body
end
end
If I want to preallocate spaces for a matrix of Foo objects
>> foos = Foo(3,4);
How is it different from creating one object with arguments x = 3, y = 4?
>> foo = Foo(3,4);
Note that if I avoid preallocation, Matlab will give me some warning due to speed optimization.
Thanks,

Akzeptierte Antwort

Khanh
Khanh am 10 Okt. 2014
Bearbeitet: Khanh am 10 Okt. 2014
Thanks for your response, Sean. However, it turns out every (nonabstract) class has a static method called empty, which can be used to create empty array. It makes things much simpler. See details here .

Weitere Antworten (1)

Sean de Wolski
Sean de Wolski am 30 Sep. 2014
Bearbeitet: Sean de Wolski am 30 Sep. 2014
It depends on how your class sizes obj:
classdef FooC
properties
x
end
methods
function obj = FooC(sz)
obj.x = 1;
obj = repmat(obj,sz);
end
end
end
Now
fc = FooC([3,4])
I don't particularly like this approach. I would typically recommend constructing it similar to how you would construct a distributed array or gpuArray using static methods. Consider this:
classdef FooC
properties
x
end
methods
function obj = FooC()
obj.x = 1;
end
end
methods(Static)
function obj = preallocate(sz)
obj = FooC();
obj = repmat(obj,sz);
end
end
end
Now FooC always returns a scalar object but FooC.preallocate will give you an sz object, compare:
fcscalar = FooC
fcmat = FooC.preallocate([3,4])
  2 Kommentare
Khanh
Khanh am 1 Okt. 2014
What if the constructor of FooC takes some argument? Say,
function obj = FooC(x,y)
obj.x = x;
obj.y = y;
end
Then the preallocate has to be written as following
methods(Static)
function obj = preallocate(sz)
obj = FooC(dummy1,dummy2);
obj = repmat(obj,sz);
end
end
Is there anyway better than that?
Thanks,
Sean de Wolski
Sean de Wolski am 1 Okt. 2014
This is where varargin is your friend:
function preallocate(sz,varargin)
obj = FooC(varargin{:})
obj = repmat(obj,sz);
end

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Performance and Memory finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by