Как написать несколько переменных, используя fprintf коротким способом в Matlab? - PullRequest
2 голосов
/ 08 марта 2019

мой код примерно такой

a= [2 4 5 8 6 7 88 9]
b= [12.8 41.3 13.7]
c= [16 18 20 10.1 17.5 49.5]
fprintf(out_file,'%d %d %d %d %d %d %d %d %f %f %f %d %d %d %f %f %f',a,b,c)

возможно ли записать преобразования (%d....%f) в fprintf в более короткой форме вместо того, чтобы повторять это много раз?

Или есть какая-нибудь другая команда, которую я могу использовать, чтобы записать то же самое в файлы?

Ответы [ 4 ]

5 голосов
/ 08 марта 2019

В этом ответе предполагается, что не нужны конечные десятичные нули .То есть [4 4.1] должно быть напечатано как 4 4.1, а не как 4 4.10000 или 4.00000 4.10000.

Let

a = [2 4 5 8 6 7 88 9];
b = [12.8 41.3 13.7];
c = [16 18 20 10.1 17.5 49.123456789]; % example with 9 decimal figures
  • Вы можете динамически построить строку формата , используя repmat и strjoin.Также вы можете использовать спецификатор формата %g, который автоматически печатает целочисленные значения без десятичных знаков:

    fprintf(strjoin([repmat({'%g'},1,numel(a)+numel(b)+numel(c))]),a,b,c)
    

    дает

    2 4 5 8 6 7 88 9 12.8 41.3 13.7 16 18 20 10.1 17.5 49.1235
    
  • Если вам нужно указать ряд значащих цифр , избегая конечных десятичных нулей:

    fprintf(strjoin([repmat({'%.8g'},1,numel(a)+numel(b)+numel(c))]),a,b,c)
    

    дает

    2 4 5 8 6 7 88 9 12.8 41.3 13.7 16 18 20 10.1 17.5 49.123457
    
  • Если выможно сделать с конечным пробелом, вам не нужно строить строку формата с повторением, так как fprintf может автоматически перерабатывать это для всех входных данных:

    fprintf('%.8g ',a,b,c)
    

    дает

    2 4 5 8 6 7 88 9 12.8 41.3 13.7 16 18 20 10.1 17.5 49.123457 
    
3 голосов
/ 08 марта 2019
% Input.
a = [2 4 5 8 6 7 88 9];
b = [12.8 41.3 13.7];
c = [16 18 20 10.1 17.5 49.5];

% Concatenate inputs.
x = [a b c];

% Find integer values.
intidx = (floor(x) == x);

% Set format string.
formatstring = char((intidx.') * '%d ' + (not(intidx).') * '%f ');
formatstring = reshape(formatstring.', 1, numel(formatstring));

% Output.
sprintf(formatstring, x)
1 голос
/ 08 марта 2019

Вы можете использовать cellfun:

cellfun                            ...
(                                  ...
    @(f,v) fprintf(outfile, f, v), ...
    {'%d ', '%f ', '%d ', '%f '},  ...
    {a, b, c(1:3), c(4:6)},        ...
    'UniformOutput' , false        ...
);

Вы также можете использовать цикл:

fmt = {'%d ', '%f ', '%d ', '%f '; a, b, c(1:3), c(4:6)};
for f = fmt;
    fprintf(outfile, f{:});
end
1 голос
/ 08 марта 2019

@ ответ ХансХирса отлично.Другой вариант использования repmat ниже.Мог бы немного сжать код, но оставить его в текущем виде для доступности.

** Альтернативный подход: ** repmat

a= [2 4 5 8 6 7 88 9];
b= [12.8 41.3 13.7];
c= [16 18 20 10.1 17.5 49.5];

fmtInt = '%d';    % format for integers
fmtFloat = '%f';  % format for floating point

fmtA = [repmat([fmtInt ' '],1,length(a)-1) fmtInt]
fmtB = [repmat([fmtFloat ' '],1,length(b)-1) fmtFloat]
fmtC = [repmat([fmtFloat ' '],1,length(c)-1) fmtFloat]

fmtstr = [fmtA ' ' fmtB ' ' fmtC]    % desired format string

% Can call fprintf() or sprintf() as required using format string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...