получение массива ячеек строки в матрицу или таблицу Matlab

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

Строки из текстовых файлов были сохранены в массив строк из {} ячеек, например:

strings={'s1' 's2' 's3'};
a=[1 2 3]

То, что содержат строки и массивы, генерируется на основе нескольких условных выражений из данных, представленных в текстовом файле, а также некоторых данных, которые у меня есть в Matlab, через цикл, выполняющий такие действия:

srings{e}=blablahFromSomewhere{e}
a(e)=otherNumericalBlahBlahFromSomwehre(e+6)

В конечном итоге я хочу объединить это в таблицу. Я обычно делаю так:

T=[a(:) strings(:)]

Но я столкнулся со следующей ошибкой:

Error using horzcat
Dimensions of matrices being concatenated are not consistent.

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

Спасибо :)


person Bastien    schedule 10.03.2014    source источник


Ответы (3)


Код

strings={'s1' 's2' 's3'};
a=[1 2 3];
outputfile = 'output.txt';

%%// Code to horziontally concatenate to result in a Nx2 cell array
out = [num2cell(num2str(a,'%d')') strings']

%%// Write to outputfile - Method 1
out = out';
fid = fopen(outputfile,'w');
fprintf(fid, '%s\t%s\n', out{:});
fclose(fid);

%%// Write to outputfile - Method 2
%%// Create a text file and clear it out of any content. This is needed, as otherwise
%%// XLSREAD was initializing CSV files with weird characters
%% dlmwrite(outputfile,'');

%%// Write to CSV file using XLSREAD
%xlswrite(outputfile,out)

%%// Verify
type(outputfile)

Вывод

out = 

    '1'    's1'
    '2'    's2'
    '3'    's3'


1   s1
2   s2
3   s3
person Divakar    schedule 10.03.2014
comment
Хорошо, ЭТО довольно близко, но затем, когда я использую следующий dlmwrite(fileName,T,'-append','delimiter','\t');, строка разбивается на столько столбцов, сколько есть вкладок. - person Bastien; 11.03.2014
comment
Отредактировано в соответствии с вашими новыми требованиями! - person Divakar; 11.03.2014
comment
Спасибо за ответ. К сожалению, это дает мне каждый символ, разделенный запятой. Я также получаю сообщение об ошибке, что он не может запустить Excel. Это оказывается головной болью задачи - person Bastien; 11.03.2014
comment
Похоже, что xlswrite предназначен только для ПК. Скачал исправление для Mac, разработанное третьей стороной, но я сохраню только в xls, что в конечном итоге не очень удобно, так как эта таблица должна перейти в R. Damn MATLAB! - person Bastien; 11.03.2014
comment
Хорошо, только что отредактировал версию кода, которая не требует XLSREAD. Надеюсь, это урегулирует сделку! Дайте нам знать! - person Divakar; 11.03.2014
comment
Здорово! Превосходно! Большое спасибо за вашу помощь и терпение! - person Bastien; 11.03.2014

Немного неясно, что вы хотите, но, похоже, это:

T = table(a(:), strings(:));

Предполагая, что я правильно читаю документацию для table.

Или, для массива ячеек:

C = [num2cell(a(:)) strings(:)];
person Notlikethat    schedule 10.03.2014
comment
Думал, что это будет идеально, но затем, поскольку я использую dlmwrite для записи в текстовый файл, я получаю следующее: Error using dlmwrite (line 118) The input cell array cannot be converted to a matrix. - person Bastien; 11.03.2014
comment
@Bastien Я никогда не использовал его, но согласно документам dlmwrite обрабатывает только числовые данные, а не строки. Если у вас достаточно новый Matlab или панель инструментов статистики, использование таблиц и writetable может сработать. Больше идей здесь< /а>. - person Notlikethat; 11.03.2014
comment
К сожалению, у меня нет таблицы для записи ... Я просто версия ниже, чтобы иметь это sadface - person Bastien; 11.03.2014

Если вы хотите получить массив символов:

    aux = num2str(a(:));
    aux = mat2cell(aux,ones(1,size(aux,1)),size(aux,2));
    T = cell2mat([aux strings(:)]);

Результатом является массив 2D-символов (при необходимости вводятся начальные пробелы):

    T =

    1s1
    2s2
    3s3
person Luis Mendo    schedule 10.03.2014
comment
ОП упомянул - T=[a(:) strings(:)], поэтому я думаю, что ему нужен вывод ячейки. - person Divakar; 11.03.2014
comment
эй @Luis Спасибо. Это не совсем то, что я хочу. Окончательная таблица должна состоять из двух столбцов: один для a, другой для strings. - person Bastien; 11.03.2014
comment
@Bastien Итак ... вы хотите получить в результате массив 2D-ячеек? - person Luis Mendo; 11.03.2014
comment
Я думаю, массив 2D-ячеек мог бы сделать да. - person Bastien; 11.03.2014
comment
хотя dlmwrite может не понравиться (см. мой комментарий к ответу ниже) - person Bastien; 11.03.2014