Проблема конкатенации матрицы чисел с вектором строк (метками столбцов) с помощью cell2mat - PullRequest
5 голосов
/ 30 июня 2011

Я пользователь Mac (10.6.8), использующий MATLAB для обработки результатов расчетов. Я вывожу большие таблицы чисел в файлы .csv. Затем я использую файлы .csv в EXCEL. Это все отлично работает.

Проблема в том, что каждый столбец чисел нуждается в метке (заголовок строки). Я не могу понять, как объединить метки в таблицу чисел. Буду очень признателен за любой совет. Вот некоторая дополнительная информация, которая может быть полезна:

Мои метки содержатся в массиве ячеек:

    columnsHeader = cell(1,15)

, которые я заполняю результатами расчетов; например:

    columnsHeader{1}  = propertyStringOne (where propertyStringOne = 'Liq')

Последовательность меток различна для каждого расчета. Моей первой попыткой было попытаться объединить метки напрямую:

    labelledNumbersTable=cat(1,columnsHeader,numbersTable)

Я получил ошибку, что составные типы должны быть одинаковыми. Поэтому я попытался преобразовать метки / строки с помощью cell2mat:

    columnsHeader = cell2mat(columnsHeader);
    labelledNumbersTable = cat(1,columnsHeader,numbersTable)

Но это взяло ВСЕ отдельные ярлыки и превратило их в одно длинное слово ... Что приводит к:

??? Ошибка при использовании ==> cat

Размеры аргументов CAT не согласованы.

Кто-нибудь знает альтернативный метод, который позволил бы мне сохранить исходный массив ячеек с метками?

Ответы [ 2 ]

6 голосов
/ 01 июля 2011

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

Вместо использования DLMWRITE для записи числовых данных (которые внутренне используют цикл for для каждой строки матрицы), вы можете напрямую вызвать FPRINTF , чтобы написать всю вещь однажды. Вы можете увидеть значительное улучшение, если в данных много строк.

Пример, иллюстрирующий разницу:

%# some random data with column headers
M = rand(100000,5);                                          %# 100K rows, 5 cols
H = strtrim(cellstr( num2str((1:size(M,2))','Col%d') ));     %'# headers

%# FPRINTF
tic
fid = fopen('a.csv','w');
fprintf(fid,'%s,',H{1:end-1});
fprintf(fid,'%s\n',H{end});
fprintf(fid, [repmat('%.5g,',1,size(M,2)-1) '%.5g\n'], M');  %'# default prec=5
fclose(fid);
toc

%# DLMWRITE
tic
fid = fopen('b.csv','w');
fprintf(fid,'%s,',H{1:end-1});
fprintf(fid,'%s\n',H{end});
fclose(fid);
dlmwrite('b.csv', M, '-append');
toc

Время на моей машине было следующим:

Elapsed time is 0.786070 seconds.    %# FPRINTF
Elapsed time is 6.285136 seconds.    %# DLMWRITE
6 голосов
/ 30 июня 2011

Вам придется обрабатывать запись заголовков столбцов и числовых данных в файл двумя различными способами.Вывод массива ячеек из строк должен быть выполнен с использованием функции FPRINTF , как описано в этой документации для экспорта массивов ячеек в текстовые файлы .Затем вы можете вывести свои числовые данные, добавив их в файл (который уже содержит заголовки столбцов), используя функцию DLMWRITE .Вот пример:

fid = fopen('myfile.csv','w');              %# Open the file
fprintf(fid,'%s,',columnsHeader{1:end-1});  %# Write all but the last label
fprintf(fid,'%s\n',columnsHeader{end});     %# Write the last label and a newline
fclose(fid);                                %# Close the file
dlmwrite('myfile.csv',numbersTable,'-append');  %# Append your numeric data
...