我有一个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个结果。
矢量操作也可以吗?
答案 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
收集其vIndex
和heading
字段。
答案 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