在matlab中访问多个结构字段而不循环遍历它

时间:2017-06-20 09:49:47

标签: matlab matlab-struct

我有一个8x18结构,每个cel包含一个事件发生的列向量。我想从单个数组中连接的一些字段中获取数据,而不必循环遍历它。我似乎找不到一种方法来在一个数组中垂直连接我感兴趣的字段。

作为一个例子,我创建了以下结构,每个单元格出现1到5次:

s(62).vector(8,18).heading.occurrences=[1;2;3];
for i=1:62
    for j=1:8
        for k=1:18
            y=ceil(rand(1)*5);
            s(i).vector(j,k).heading.occurrences=rand(y,1);
        end
    end
end

现在,如果希望获得多个单元格中的所有匹配项,同时将i保持为常量i=1,则以下工作:

ss=s(1).vector([1 26 45]);                     
h=[ss.heading];            
cell2mat({h.occurrences}')

现在我想对s做同样的事情,例如s([1 2 3]).vector([1 26 45]),那会怎么做?我尝试了xx=s([1 2 3])yy=xx.vector([1 26 45]),但这会产生错误:

  

大括号或点索引表达式的预期输出,但有3个结果。

矢量操作也可以吗?

2 个答案:

答案 0 :(得分:3)

这是一个矢量化解决方案,适用于s和字段vector的索引向量:

sIndex = [1 2 3];    % Indices for s
vIndex = [1 26 45];  % Indices for 'vector' field

v = reshape(cat(3, s(sIndex).vector), 144, []);
h = [v(vIndex, :).heading];
out = vertcat(h.occurrences);

它使用cat将所有vector字段连接成一个8乘18乘numel(sIndex)矩阵,reshapes将其转换为144 x by { {1}}矩阵,然后为numel(sIndex)指定的行编制索引,并使用vertcat代替cell2mat收集其vIndexheading字段。

答案 1 :(得分:1)

很难对整个操作进行矢量化,但这应该有效。

% get vector field and store in cell array
s_new = { s(1:3).vector };

% now extract heading field, this is a cell-of-cells
s_new_heading = cellfun(@(x) { x.heading }', s_new, 'UniformOutput', false);

occurences = {};
for iCell = 1:length(s_new_heading)
    % use current cell
    cellHere = s_new_heading{iCell};

    % retain indices of interest, these could be different for each cell
    cellHere = cellHere([ 1 26 45 ]);

    % extract occurrences
    h = cellfun(@(x) x.occurrences, cellHere, 'UniformOutput', false);
    h_mat = cell2mat(h);

    % save them in cell array 
    occurences = cat(1, occurences, h_mat);
end