Как добавить в окончательное измерение? - PullRequest
2 голосов
/ 25 февраля 2011

Я загружаю несколько структур из отдельных файлов и хочу собрать их в одну структуру массивов.Так как структура имеет много полей, в данный момент я зацикливаюсь на ее fieldnames, например:

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

Это прекрасно работает для скалярных полей, однако некоторые поля являются векторами или матрицами ипоэтому хранятся в виде матриц или тензоров 3-го ранга соответственно.Я могу использовать некоторые if length и if ndims для индивидуального рассмотрения этих случаев, но

есть ли более общий способ использования следующего более высокого измерения для добавления?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Чтобы добавить к последнему измерению, вы можете использовать команды CAT и NDIMS :

%# find the number of dimensions
nd = ndims(results.(fn));
%# catenate along the last dimension
results.(fn) = cat(nd,results.(fn), newResult.(fn));

Обратите внимание, что построение массивов путем объединения может быть довольно медленным, если имеется много итераций, хотя в вашем случае предварительное выделение будет несколько затруднено, поэтому я сделаю это только в случае необходимости Кроме того, использование переменных results и result настраивает вас на трудно обнаруживаемые ошибки.

0 голосов
/ 25 февраля 2011

Это мое текущее решение, которым я не слишком доволен:

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

Конечно, я мог бы вручную расширить его до любого ранга тензора до разумной степени, но это очень избыточно инекрасиво, поэтому я действительно ценю лучшее решение, которое работает и в общем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...