Данный
a=[1 2 3];
b=[4 5 6];
Output in file should look like:
1 2 3 / 4 5 6
Есть ли способ добиться этого за один вызов fprintf()?
У меня есть решение, в котором между a
и b
нет обратной косой черты.
fprintf(fileID, '%d %d ', a, b);
output:
1 2 3 4 5 6 (no backslash in between)
Это добавит обратную косую черту после каждого элемента, то есть 1 / 2 / 3 / 4 / 5 / 6
Почему это должен быть один звонок fprintf
? Просто сделайте три.
Конечно, это может быть три звонка. Я просто хотел убедиться, что нет очевидного решения (которого я не вижу) моей проблемы.
fprintf(fileID, '%d %d %d / %d %d %d ', a, b)
затем вы можете сгенерировать спецификацию формата, используя repmat
, чтобы повторить %d
для стольких элементов, сколько есть у a
или b
Что такое идентификатор файла?
@iohans Файл, в который должны быть записаны выходные данные, возвращенные `fileID= fopen('my_file.txt')´
sprintf('%d%c',[a,b;+' / '])
Вы можете получить один вызов fprintf, если хотите динамически построить строку формата.
fileID=1;
a=[1,2,3];
b=[4,5,6,7];
c=[8,9];
fprintf(fileID,strjoin(cellfun(@(c)sprintf('%d ',c),{a,b,c},'UniformOutput',false),'/ '));
Это некрасиво, и, вероятно, стоит заморачиваться только в том случае, если у вас много вызовов fprintf в цикле и вам нужно избежать накладных расходов, но технически это достигает того, что вы просили.
Что бы это ни стоило, вызов cellfun
на самом деле просто «замаскированная петля», он только визуально однострочный и не помогает ни в чем другом (например, в производительности), но это действительно отвечает на букву вопроса, поэтому +1
Правда, cellfun
, вероятно, даже добавляет немного накладных расходов. Я имел в виду замену многих обращений к fprintf
множеством обращений к sprintf
. Если вы можете позволить себе накладные расходы, то таким образом я ускорил время выполнения.
Так что добавьте косую черту...
fprintf(fileID, '%d / %d ', a, b);