如何附加到最终维度?

时间:2011-02-25 10:51:28

标签: arrays matlab struct append field

我从单独的文件加载多个结构,并希望在一个数组结构中收集它们。由于结构体有很多字段,我现在循环遍历fieldnames,如下所示:

for fnc = fieldnames(result)'
  fn = fnc{:}
  results.(fn) = [results.(fn) result.(fn)];
end

这适用于标量字段,但是某些字段是向量或矩阵,因此应分别存储为矩阵或第3级张量。我可以使用一些if lengthif ndims来单独处理这些案例,但

  

是否有更通用的方法来使用下一个更高维度进行追加?

2 个答案:

答案 0 :(得分:2)

要沿最后一个维度追加,您可以使用命令CATNDIMS

%# 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;

我当然可以手动将其扩展到任何张量等级达到合理程度,但这是非常多余和丑陋的,所以我真的很感激一个更好看的解决方案,也适用于一般情况。