2015-12-24 4 views
1

Предположим, у нас есть матрица N-by-d в Matlab. Пусть это будетЭффективно писать матрицу в файл в пользовательском формате в Matlab

A = rand(N,d); 

Кроме того, пусть D быть массив ячеек строк, например,

D = {'a1', 'a2', ..., 'aN'}; 

Я хотел бы создать текстовый файл, у которого я-я строка имеет вид

D{i} 1:A(i,1) 2:1:A(i,2) ... N:A(i,N)\n 

Существует тривиальный способ сделать это; открыть файл для записи и с помощью двойного for цикла написать каждую строку следующим образом:

fid = fopen('test.txt', 'w'); 
for i=1:size(A,1) 
    fprintf(fid, '%s', D{i}); 
    for j=1:size(A,2) 
     fprintf(fid, ' %d:%g', j, A(i,j)); 
    end 
    fprintf(fid, '\n'); 
end 
fclose(fid); 

Это, однако, может быть очень медленным, если N и d достаточно велико. Я ищу эффективный метод (если он есть), который мог бы избежать использования этих циклов for. По крайней мере, один из них.

ответ

1

Воспользовавшись как fprintf итерацию от Matlab над массивами, внутренний for цикл может быть заменен:

fprintf(fid, ' %d:%g', [1:size(A,2);A(i,:)]); 

Таким образом:

fid = fopen('test.txt', 'w'); 
z = 1:size(A,2); 
for i=1:size(A,1) 
    fprintf(fid, '%s', D{i}); 
    fprintf(fid, ' %d:%g', [z;A(i,:)]); 
    fprintf(fid, '\n'); 
end 
fclose(fid); 

Вы должны будете использовать гораздо больше памяти для избавиться от внешнего цикла for, что, вероятно, не будет хорошей идеей, так это ваша матрица A очень велика.

+0

Большое спасибо @horchler! Это именно то, что я искал! Это действительно ускорило весь процесс. Во всяком случае, это хорошая функция 'fprintf' знать! – nullgeppetto

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