2015-03-02 1 views
2

В настоящее время я пытаюсь экспортировать несколько матриц неравных длин в разделительный .txt-файл, таким образом, я добавлял более короткие матрицы с 0, так что dlmwrite может использовать horzcat без ошибок:Экспорт пустых значений в файл .txt - MATLAB

dlmwrite(filename{1},[a,b],'delimiter','\t') 

Однако в идеале я не хочу, чтобы нули появляются в самом файле .txt - а скорее записи оставлены пустыми.

В настоящее время .txt файл выглядит следующим образом:

55875 3.1043e+05 
56807 3.3361e+05 
57760 3.8235e+05 
58823 4.2869e+05 
59913 4.3349e+05 
60887 0 
61825 0 
62785 0 
63942 0 
65159 0 
66304 0 
67509 0 
68683 0 
69736 0 
70782 0 

Но я хочу, чтобы выглядеть следующим образом:

55875 3.1043e+05 
56807 3.3361e+05 
57760 3.8235e+05 
58823 4.2869e+05 
59913 4.3349e+05 
60887 
61825 
62785 
63942 
65159 
66304 
67509 
68683 
69736 
70782 

Есть в любом случае я могу это сделать? Есть ли альтернатива dlmwrite, которая будет означать, что мне не нужны матрицы одинаковой длины?

ответ

2

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

Этап 1: Получить ячейки строк, соответствующих числовых данных из столбца вектора входов a, b, c и так далее -

%// Concatenate all arrays into a cell array with numeric data 
A = [{a} {b} {c}] %// Edit this to add more columns 

%// Create a "regular" 2D shaped cell array to store the cells from A 
lens = cellfun('length',A) 
max_lens = max(lens) 

A_reg = cell(max_lens,numel(lens)) 
A_reg(:) = {''} 
A_reg(bsxfun(@le,[1:max_lens]',lens)) = cellstr(num2str(vertcat(A{:}))) %//' 

%// Create a char array that has string data from input arrays as strings 
wsp = repmat({' '},max_lens,1) %// Create whitespace cell array 
out_char = []; 
for iter = 1:numel(A) 
    out_char = [out_char char(A_reg(:,iter)) char(wsp)] 
end 
out_cell = cellstr(out_char) 

Этап 2: Теперь, что у вас есть out_cell как массив ячеек, в котором строки должны быть записаны в текстовый файл, у вас есть два варианта для самой операции записи.

Вариант 1 -

dlmwrite('results.txt',out_cell(:),'delimiter','') 

Вариант 2 -

outfile = 'results.txt'; 
fid = fopen(outfile,'w'); 
for row = 1:numel(out_cell) 
    fprintf(fid,'%s\n',out_cell{row}); 
end 
fclose(fid); 
+0

Я пытаюсь реализовать это шаг за шагом, чтобы понять это. После выполнения p1 и первого dlmwrite он возвращает ошибку: Ошибка с использованием dlmwrite (строка 112) Массив входных ячеек не может быть преобразован в матрицу. – AnnaSchumann

+0

(при использовании моих собственных входных данных). – AnnaSchumann

+0

@AnnaSchumann Проверьте другой подход, добавленный в конце, если это работает? – Divakar

3

Если всегда длиннее, чем б можно разделить вектор а на два вектора одинаковой длины, как вектор Ь, а остальные:

a = [1 2 3 4 5 6 7 8]'; 
b = [9 8 7 ]'; 

len = numel(b); 
dlmwrite('foobar.txt', [a(1:len), b ], 'delimiter', '\t'); 
dlmwrite('foobar.txt', a(len+1:end), 'delimiter', '\t', '-append'); 
+0

Действительно хороший и простой метод. К сожалению, один из них не всегда больше, чем другой, и я могу также иметь более двух матриц для обработки в будущем. Возможно, я смогу адаптировать этот подход ... – AnnaSchumann

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