HOWTO · MATLAB

Tabela MATLAB fprintf

Pode-se imprimir texto formatado e variáveis usando a função fprintf() no MATLAB.

Nesta página

Use MATLAB fprintf com uma especificação de formato e os valores correspondentes para imprimir uma tabela legível. Ao usar conversões com largura de campo, separe os campos com espaços literais e termine cada linha com o escape de nova linha (\n). Tabulações (\t) também podem separar os campos, mas as paradas de tabulação talvez não alinhem as colunas de modo consistente. A mesma chamada pode enviar a saída para a janela de comandos ou para um arquivo.

Entenda as especificações de formato de fprintf

A forma básica é fprintf(formatSpec, values...). A especificação de formato é um vetor de caracteres ou uma string que contém texto comum e especificações de conversão. Cada conversão consome um valor fornecido: %s formata texto, %d formata um inteiro e %f formata um número em ponto fixo. Por exemplo, fprintf('Count: %d\n', 3) escreve um rótulo, o valor e uma nova linha.

Uma conversão pode incluir sinalizadores, uma largura mínima de campo e uma precisão, como em %-10s ou %8.2f. O sinalizador de menos alinha o valor à esquerda; sem ele, o valor fica alinhado à direita. A precisão em %8.2f solicita dois algarismos após o separador decimal. A largura é um mínimo: se o valor for mais longo, ele ultrapassará esse espaço em vez de ser cortado. Para exibir um sinal de porcentagem, use %%.

Quando os valores incluem uma matriz, fprintf processa os elementos na ordem por colunas do MATLAB e repete o formato conforme necessário. A função não deduz que cada conversão do formato corresponde a uma coluna da matriz. Para tabelas organizadas por linhas, indexe explicitamente os valores de cada linha, como no exemplo a seguir. Consulte a referência da MathWorks sobre fprintf para ver a sintaxe completa e as opções de conversão.

Crie uma tabela a partir de dados do MATLAB

Mantenha os cabeçalhos e os dados na mesma ordem. Este exemplo separa os campos com espaços literais e termina cada linha com \n; as conversões com largura reservam espaço para alinhar os valores. O escape \t também pode separar os campos, mas as paradas de tabulação não garantem alinhamento consistente quando os textos ou as configurações de exibição variam. O laço fornece os valores de uma linha por vez. Ele usa a sintaxe comum do MATLAB, que também é aceita pelo ambiente de execução Octave configurado.

Execute este exemplo. Os rótulos Name, Score e Mean exibidos no código permanecem em inglês.

names = {'Ava', 'Milo', 'Zoe'};
scores = [85, 92, 78];
means = [91.25, 84.50, 96.75];

fprintf('%-8s %6s %8s\n', 'Name', 'Score', 'Mean');
for k = 1:numel(names)
    fprintf('%-8s %6d %8.2f\n', names{k}, scores(k), means(k));
end
Name      Score     Mean
Ava          85    91.25
Milo         92    84.50
Zoe          78    96.75

Os formatos do cabeçalho e das linhas contêm três conversões cada, na mesma ordem dos valores fornecidos: nome, pontuação e média. A nova linha encerra cada linha impressa. Se, em vez disso, você passar uma matriz diretamente, lembre-se de que o MATLAB percorre a primeira coluna de cima para baixo antes de passar à seguinte. Organize os dados ou use indexação para obter a ordem desejada na tabela.

Alinhe colunas e formate números

Escolha as larguras com base no cabeçalho ou valor mais longo esperado. No exemplo, %-8s reserva pelo menos oito caracteres para cada nome e o alinha à esquerda. %6d reserva seis caracteres para a pontuação inteira, enquanto %8.2f reserva oito caracteres e mostra duas casas decimais para a média. O campo se expande quando o conteúdo ultrapassa a largura solicitada; por isso, confira valores representativos ao projetar um relatório de largura fixa.

As tabulações (\t) avançam até a próxima parada de tabulação, e não até uma posição fixa após cada valor. O alinhamento pode parecer irregular quando os textos têm comprimentos diferentes ou quando a saída é exibida com outras configurações de tabulação. Para obter colunas previsíveis, use conversões com largura, como %-12s %8.2f, e escolha um editor de texto ou console com fonte monoespaçada. A precisão altera o arredondamento exibido, mas não o valor armazenado.

Grave a saída formatada da tabela em um arquivo

Passe um identificador de arquivo como primeiro argumento de fprintf para enviar o mesmo texto formatado a um arquivo. Abra o arquivo com fopen, confira se a abertura foi bem-sucedida e feche-o ao terminar de escrever. Este exemplo autocontido grava uma tabela pequena em um caminho temporário e usa onCleanup para fechar o identificador mesmo que o código seguinte seja interrompido antes do fim. Os rótulos Name e Score exibidos no código permanecem em inglês.

names = {'Ava', 'Milo'};
scores = [85, 92];
path = [tempname(), '.txt'];
fileID = fopen(path, 'w');
if fileID >= 0
    closeFile = onCleanup(@() fclose(fileID));
    fprintf(fileID, '%-8s %6s\n', 'Name', 'Score');
    for k = 1:numel(names)
        fprintf(fileID, '%-8s %6d\n', names{k}, scores(k));
    end
    clear closeFile
end

O modo 'w' cria ou substitui o arquivo de destino; portanto, escolha um caminho cujo conteúdo possa ser sobrescrito com segurança. Se fopen retornar um identificador negativo, não foi possível abrir o arquivo; confira o caminho e as permissões antes de gravar. Para relatórios recorrentes, defina o caminho de saída com cuidado e feche cada identificador depois das gravações para liberar o arquivo.

Resolva problemas comuns de formatação de tabelas

Se as colunas mostrarem valores incorretos, compare a ordem das conversões com a ordem dos valores passados a fprintf. Cada %s, %d ou %f deve receber um valor compatível; uma incompatibilidade pode gerar uma saída enganosa ou um aviso de formatação. No caso de matrizes, o percurso por colunas costuma explicar por que os valores aparecem em uma sequência inesperada. Use a indexação escalar das linhas ou transponha e reorganize os dados de forma intencional, em vez de supor que fprintf associa as conversões às colunas.

Se as colunas não ficarem alinhadas, use larguras explícitas em vez de tabulações e reserve espaço para o texto e o número mais longos. Se os decimais parecerem arredondados, ajuste a precisão em uma conversão como %.4f; isso afeta apenas a representação em texto. Se o arquivo ficar vazio ou incompleto, confirme que fopen funcionou, direcione cada gravação ao identificador do arquivo e feche-o depois da última linha. Mantenha as conversões, os valores fornecidos e os separadores na mesma ordem para facilitar a conferência e a manutenção da tabela.