Structure initialization with repmat

放肆的年华 提交于 2019-12-20 07:51:37

问题


I want to initalize structures and it seems to be too slow. How do I do it with repmat, which is supposed to be a much faster solution in Matlab? Originally:

for i=1:30
    myloc.one.matrixBig(i,1).matrixBig= zeros(6,6);
    for j=1:5
      myloc.one.id(i,j) = 0;
      for k=1:10
          myloc.one.final(j,k).final(i,1) = 0;
      end
    end
end

EDIT:

   for j=1:30
       for i=1:10 
          myObject{i,j}.s = zeros(6,1);
          myObject{i,j}.f = zeros(6,1);
       end
   end

Also, am I able to make it faster by adding some [] initialization even before, or is that limit of my optimization possibilities? Thanks very much for help!


回答1:


Here's the equivalent vectorized code of the first code snippet:

myloc.one = struct('id', zeros(30, 5), ...
  'matrixBig', struct('matrixBig', repmat({zeros(6)}, 30, 1)), ...
  'final', struct('final', repmat({zeros(30, 1)}, 5, 10)));

or alternatively:

myloc.one = struct('id', zeros(30, 5), ...
   'matrixBig', repmat(struct('matrixBig', zeros(6)), 30, 1), ...
   'final', repmat(struct('final', zeros(30, 1)), 5, 10));

Choose the one you like most.

As for the second (edited) part, it can be replaced with:

myObject = repmat({struct('s', zeros(6, 1), 'f', zeros(6, 1))}, 30, 10);

Note that there is no need to preallocate anything because there aren't any explicit loops here.




回答2:


Well in this case the first question is why are you using a cell array of structs. One of the fundamentals of matlab is that everything can be vectorised. So instead set up a matrix of structs.

% Define the empty struct, struct itself is vectorised   
myloc=struct('s',cell(10,30),'f',cell(10,30));
%Assign values
[myloc(:).s]=deal(0),[myloc(:).f]=deal(0);

A matrix of structures is a far more powerful datatype. For example if you want to extract a single row of the field in to a vector you can simply use the following syntax

sRow8=[myloc(8,:).s]


来源:https://stackoverflow.com/questions/17639348/structure-initialization-with-repmat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!