我从单独的文件加载多个结构,并希望在一个数组结构中收集它们。由于结构体有很多字段,我现在循环遍历fieldnames
,如下所示:
for fnc = fieldnames(result)'
fn = fnc{:}
results.(fn) = [results.(fn) result.(fn)];
end
这适用于标量字段,但是某些字段是向量或矩阵,因此应分别存储为矩阵或第3级张量。我可以使用一些if length
和if ndims
来单独处理这些案例,但
是否有更通用的方法来使用下一个更高维度进行追加?
答案 0 :(得分:2)
%# find the number of dimensions
nd = ndims(results.(fn));
%# catenate along the last dimension
results.(fn) = cat(nd,results.(fn), newResult.(fn));
请注意,如果有很多迭代,通过连接构建数组可能会相当慢,但在您的情况下,预分配将涉及一些,所以我只会在必要时才这样做。此外,使用变量results
以及result
正在为难以发现的错误做好准备。
答案 1 :(得分:0)
这是我目前的解决方案,我不太高兴:
% merge current result fields into results
resFields = fieldnames(result);
for jf = 1:numel(resFields)
rf = resFields{jf};
resf = result.(rf);
nd = ndims(resf);
rt = r.(rf);
if nd==2 && min(size(result.(rf)))==1 % scalar or vector
rt = [ rt; result.(rf) ];
elseif nd == 2 % true matrix, so append to 3rd rank tensor
rt(:,:,end+1) = result.(rf);
elseif ndims(result.(rf)) == 3 % 3rd rank tensor, append to 4th rank tensor
rt(:,:,:,end+1) = result.(rf);
else
warning(['Too many dimensions for result field ' rf ': ' num2str(ndims(result.(rf)))]);
rt(end+1) = result.(rf);
end;
results.(rf) = rt;
end;
end;
我当然可以手动将其扩展到任何张量等级达到合理程度,但这是非常多余和丑陋的,所以我真的很感激一个更好看的解决方案,也适用于一般情况。