Matrix/Array of Objects vs. Class Constructor

조회 수: 10 (최근 30일)
Khanh
Khanh 2014년 9월 30일
편집: Khanh 2014년 10월 10일
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,

채택된 답변

Khanh
Khanh 2014년 10월 10일
편집: Khanh 2014년 10월 10일
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 .

추가 답변 (1개)

Sean de Wolski
Sean de Wolski 2014년 9월 30일
편집: Sean de Wolski 2014년 9월 30일
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
Khanh
Khanh 2014년 10월 1일
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 2014년 10월 1일
This is where varargin is your friend:
function preallocate(sz,varargin)
obj = FooC(varargin{:})
obj = repmat(obj,sz);
end

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Performance and Memory에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by