Вы очень близко. Что бы я сделал, это изменить ваш вызов cellfun
, чтобы выход был массивом ячеек вместо числового массива. Используйте флаг «UniformOutput'
» и установите для этого значение 0 или «ложь».
Когда вы закончите, создайте новый массив ячеек, в котором и массив ячеек имен, и массив ячеек размера сложены друг на друга. Затем вы можете позвонить fprintf
.
% Save the names in a cell array
A = {myStructure.name};
% Save the sizes in another cell array
B = cellfun(@numel, {myStructure.data}, 'UniformOutput', 0);
% Create a master cell array where the first row are the names
% and the second row are the sizes
out = [A; B];
% Print out the elements side-by-side
fprintf('%s\t%d\n', out{:});
Трюк с третьей строки кода является то, что, когда вы раскатать массив ячеек с помощью {:}
, это создает список разделенных запятыми раскатывают в столбцам формате, и тем самым out{:}
на самом деле дает вам:
A{1}, B{1}, A{2}, B{2}, ..., A{n}, B{n}
... который обеспечивает чередование, в котором вы нуждаетесь. Поэтому предоставление этого порядка в fprintf
совпадает с указанными спецификаторами формата и, таким образом, дает вам то, что вам нужно. Вот почему важно собрать массивы ячеек, чтобы каждый столбец предоставил необходимую вам информацию.
Minor Примечание
Конечно никогда не следует забывать, что один из самых простых способов решения вашей проблемы, чтобы просто использовать простой for
цикл. Несмотря на то, что петли for
считаются плохой практикой, их производительность прошла долгий путь в эволюции MATLAB.
Проще говоря, просто сделать это:
for ii = 1 : numel(myStructure)
fprintf('%s\t%d\n', myStructure(ii).name, numel(myStructure(ii).data));
end
Приведенный выше код, возможно, более удобным для чтения по сравнению с тем, что мы делали выше с сотовыми массивов.Вы напрямую обращаетесь к структуре, а не создаете промежуточные переменные с целью вызова fprintf
один раз.
Пример Запуск
Вот пример этого хода. Используя данные, приведенные ниже:
clear myStructure;
myStructure(1).name = 'hello';
myStructure(1).data = rand(5,1);
myStructure(2).name = 'hi';
myStructure(2).data = zeros(3,3);
myStructure(3).name = 'huh';
myStructure(3).data = ones(6,4);
я получаю следующий вывод после выполнения кода печати:
hello 5
hi 9
huh 24
Мы можем видеть, что размеры являются правильными в качестве первого элемента в структуре просто случайный 5, второй элемент представляет собой матрицу 3 x 3 = 9, а последний элемент представляет собой матрицу размером 6 x 4 = 24.
Пожалуйста, предоставьте представительный набор данных и желаемый результат, я понятия не имею, что вы пытаетесь выполнить. Предполагая, что вы печатаете их по мере их обработки, если вы печатаете прогресс, почему вам нужно «repmat»? – excaza
После публикации вопроса, я вижу, как это может сбивать с толку. Я отредактирую свой вопрос. – jenszvs
позволяет не называть его 'struct', так как это команда для создания структур. – Finn