how to preallocate an object array?
28 views (last 30 days)
Show older comments
Mark Ricard
on 17 Nov 2020
Commented: Walter Roberson
on 18 Nov 2020
I am trying to preallocate an object array of a class. Below is the class that I am using in MyobjectArray class
classdef MyData
properties
x = []; % a column vector of data
end
methods
function obj = MyData(nRows)
if nRows > 0
obj.x = zeros(nRows,1);
end
end
end
end
In the code below I am using obj.value = zeros(nArrays,1); to preallocate. What is the correct way to preallocate an object array?
classdef MyobjectArray
properties
value = []; % an array of MyData objects
end
methods
function obj = MyobjectArray(nArrays, nRows)
if nargin ~= 0
obj.value = zeros(nArrays,1);
for i = 1:nArrays
obj(i).value = MyData(nRows);
end
end
end
end
end
0 Comments
Accepted Answer
Walter Roberson
on 17 Nov 2020
Do not initialize value to [] if the property is not going to have type "double" .
If it is going to have type that is one of the built-in types, use empty() to create an empty array of the correct type
If MyData is not going to return double, then do not assign zeros to initialize the property . If MyData(nRows) returns a constant value you would be better with
[obj(1:nArrays).value] = MyData(nRows);
2 Comments
Walter Roberson
on 18 Nov 2020
function obj = MyobjectArray(nArrays, nRows)
if nargin ~= 0
[obj(1:nArrays).value] = deal(MyData(nRows));
end
end
Tested.
This does assume that myData(nRows) returns constant output.
The property will be set to a vector in which each item has the same data pointer -- one original copy of the MyData object being pointed to multiple times. However, as these are value class objects and not handle class objects, that is not a problem unless you plan to use mex functions that overwrite the input without properly checking first to see if they are dealing with shared copies or not: any conformant function will either automatically or deliberately use copy-on-write.
More Answers (0)
See Also
Categories
Find more on Cell Arrays in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!