Matlab, как записать две числовые переменные в переменную массива ячеек с одной строкой?

У меня есть две числовые переменные размера ‹5x1>

    X = [ 1, 2, 3, 4, 5]';
    Y = [-1, -2, 4.5, 12.6, -5]';

и я хотел бы написать массив ячеек переменной строки ‹5x1 cell>, используя эти переменные X и Y с выводом как

'     1,-1,'
'     2,-2,'
'     3,4.5,'
'     4,12.6,'
'     5,-5'

Любая помощь будет признательна. Спасибо


person user3771510    schedule 24.06.2014    source источник
comment
Вам нужно, чтобы пробел был предварительно добавлен ко всем ячейкам? И в последней ячейке есть только один comma sign, а в других - два?   -  person Divakar    schedule 24.06.2014
comment
В дополнение к вопросу @Divakar: Для чего вам нужна эта ячейка жал?   -  person Schorsch    schedule 24.06.2014
comment
Спасибо за ответ. Да, мне нужны пробелы, предварительно добавленные ко всем ячейкам, а в последней ячейке должен быть только один знак запятой. Мне нужен этот конкретный формат для передачи в определенное программное обеспечение. Спасибо за помощь.   -  person user3771510    schedule 24.06.2014


Ответы (3)


Я думаю, что это самый интуитивно понятный и быстрый способ:

%# example data
X = [ 1, 2, 3, 4, 5]';
Y = [-1, -2, 4.5, 12.6, -5]';

%# Controls the amount of leading spaces. This may depend on your specific 
%# software (or hardware?) so I left it here as a seperate variable.
spaces = {repmat(' ', 1,5)};  %# NOTE: must be cell to protect it from trim()

%# Now form the cellstring
S = strcat(spaces, num2str(X), ',', num2str(Y, '%-g'), ',');

%# complete it by removing the last comma
S{end} = S{end}(1:end-1);
person Rody Oldenhuis    schedule 24.06.2014
comment
Спасибо, однако последний ответ - ‹ячейка 1x1› и не в правильном формате. - person user3771510; 24.06.2014
comment
+1, я пытался реализовать это, но застрял, думая, как обойти обрезку. Хороший ответ - person Nishant; 24.06.2014
comment
@ user3771510 на моей машине окончательный ответ - ячейка 5x1, точно такая же, как и в вопросе. Я тестировал ее на R2014a и R2011a. - person Nishant; 24.06.2014
comment
@ user3771510: здесь то же самое; Я тестировал на R2010a/b, R2012a, R2013b. Какова ваша версия? - person Rody Oldenhuis; 24.06.2014
comment
@ user3771510: вам нужны целые числа, чтобы они были целыми числами? Я имею в виду, что это решение всегда использует 2 цифры, даже для элементов, где round(N)==N; это приемлемо, или дополнительные цифры следует включать только в случае необходимости? - person Rody Oldenhuis; 24.06.2014
comment
Спасибо, теперь я понял это правильно. это массив ячеек 5x1. Большое спасибо - person user3771510; 24.06.2014
comment
второй может быть num2str(Y, '%g'), так как он использует как можно меньше нулей, поэтому 12.6 будет 12.6, а -2 будет -2 - person brechmos; 24.06.2014
comment
@brechmos: спасибо, это то, о чем я думал. Я отредактирую его. - person Rody Oldenhuis; 24.06.2014
comment
Роди, в формате дополнительные цифры следует включать только при необходимости. Спасибо за помощь. - person user3771510; 24.06.2014

Один подход на основе arrayfun -

%// Inputs
X = [ 1, 2, 3, 4, 5]'
Y = [-1, -2, 4.5, 12.6, -5]'

t1 = arrayfun(@(k) strcat(num2str(X(k)),',',num2str(Y(k)),','),[1:numel(X)]','uni',0)
out = strcat({'     '},t1)
last_ele = char(out(end))
out(end) = {last_ele(1:end-1)} %// out is the desired output

Выход -

out = 
    '     1,-1,'
    '     2,-2,'
    '     3,4.5,'
    '     4,12.6,'
    '     5,-5'
person Divakar    schedule 24.06.2014
comment
почему бы не использовать t1 = arrayfun(@(k) strcat(' ',num2str(X(k)),',',num2str(Y(k)),','),[1:numel(X)]','uni',0) вместо записи в две строки? - person Nishant; 24.06.2014
comment
@Nishant Думаю, я не хотел сжиматься в одной строке. Да, кстати, этот способ конкатенации whitespace не будет работать с strcat. - person Divakar; 24.06.2014

Вероятно, есть лучший способ, чем зацикливание, но это должно работать:

X = [1:5]';
Y = [-1, -2, 4.6, 12.6, -5]';
XY = [X Y];

C = cell( size(XY, 1), 1);
for ii=1:size(XY, 1)
        C{ii} = sprintf('     %d,%g', XY(ii,:) );

        if( ii ~= length(XY) )
               C{ii} = [C{ii} ','];
        end

end

C
person brechmos    schedule 24.06.2014
comment
Массив @Divakar ниже, вероятно, является лучшим решением или некоторой комбинацией. Чем меньше петель, тем лучше :-) - person brechmos; 24.06.2014
comment
Теперь я дошел до того, что мой ответ выше - это ответ, но не такой эффективный, как другие :-) - person brechmos; 24.06.2014
comment
Если он дает желаемый результат, он того стоит! +1 за усилия. - person Divakar; 24.06.2014
comment
Возможно нужна поправка на предраспределение - C = cell(size(XY,1),1) - person Divakar; 24.06.2014