2016-08-17 4 views
0

Я хотел бы использовать fprintf, чтобы показать ход выполнения кода в окне команд.Выполнение печати в командном окне

У меня есть N x 1 массив структур, назовем его myStructure. Каждый элемент имеет поля name и data. Я хотел бы напечатать name бок о бок с количеством точек данных, как например:

name1 number1 
name2 number2 
name3 number3 
name4 number4 
... 

можно использовать repmatN раз вместе с fprintf. Проблема в том, что все числа должны совпадать между именами в массиве ячеек C.

fprintf(repmat('%s\t%d',N,1),C{:}) 

я могу использовать cellfun, чтобы получить имена и число точек данных.

names = {myStucture.name}; 
numpoints = cellfun(@numel,{myStructure.data}); 

Однако я не уверен, как получить это в массив ячеек с чередующимися элементами для C сделать fprintf работу.

Есть ли способ сделать это? Есть ли лучший способ получить fprintf, чтобы вести себя так, как я желаю?

+0

Пожалуйста, предоставьте представительный набор данных и желаемый результат, я понятия не имею, что вы пытаетесь выполнить. Предполагая, что вы печатаете их по мере их обработки, если вы печатаете прогресс, почему вам нужно «repmat»? – excaza

+0

После публикации вопроса, я вижу, как это может сбивать с толку. Я отредактирую свой вопрос. – jenszvs

+1

позволяет не называть его 'struct', так как это команда для создания структур. – Finn

ответ

2

Вы очень близко. Что бы я сделал, это изменить ваш вызов 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.

+0

А, конечно, вывод в 'A {:}' также берет остальные строки, которые делают именно то, что я хочу! Кроме того, пожалуйста, извините мой ужасный выбор именования, это был просто промах ума, поскольку ни одно из имен переменных не было из моего исходного кода, поэтому я просто что-то написал. Если бы вы могли отредактировать это из своего ответа, это было бы очень оценено, поскольку я очень смущен. Конечно, оставляя это, я напоминаю о позоре, так что, возможно, это тоже хорошее напоминание :) – jenszvs

+0

@Jens Я рад обязать :) Позвольте мне сейчас отредактировать его. Нечего смущаться. Не за что. Я гарантирую, что почти каждый программист MATLAB совершил это затенение непреднамеренно ... по крайней мере один раз в жизни. Я только что научился следить за тем, чтобы я никогда не делал этого, потому что это наверняка укусило меня в @ $$ раньше. – rayryeng

Смежные вопросы