how to preallocate an object array?

32 visualizaciones (últimos 30 días)
Mark Ricard
Mark Ricard el 17 de Nov. de 2020
Comentada: Walter Roberson el 18 de Nov. de 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

Respuesta aceptada

Walter Roberson
Walter Roberson el 17 de Nov. de 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 comentarios
Mark Ricard
Mark Ricard el 18 de Nov. de 2020
Editada: Walter Roberson el 18 de Nov. de 2020
This runs but I am not correctly prellocating the array of MyData objects.
The goal is to create 3 arrays of MyData objects, each MyData object is a column vector
of 10 doubles.
classdef MyobjectArray
properties
value; % an array of MyData objects
end
methods
function obj = MyobjectArray(nArrays, nRows)
if nargin ~= 0
for i = 1:nArrays
obj(i).value = MyData(nRows);
end
end
end
end
end
classdef MyData
properties
x = []; % a column vector of data
end
methods
function obj = MyData(nRows)
if nRows > 0
obj.x = linspace(1,nRows,nRows)';
end
end
end
end
Walter Roberson
Walter Roberson el 18 de Nov. de 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.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Cell Arrays en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by