Добавление строки в массив Matlab - PullRequest
29 голосов
/ 18 февраля 2010

Как добавить строку в столбец массива Matlab?

Вот небольшой фрагмент кода того, что я пытаюсь сделать:

for_loop
  filename = 'string';
  name=[name; filename]
end

Ответы [ 9 ]

82 голосов
/ 18 февраля 2010

Вам нужно использовать массивы клеток. Если количество итераций известно заранее, я предлагаю вам предварительно выделить:

N = 10;
names = cell(1,N);
for i=1:N
    names{i} = 'string';
end

в противном случае вы можете сделать что-то вроде:

names = {};
for i=1:10
    names{end+1} = 'string';
end
9 голосов
/ 19 февраля 2010

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

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

>> string1 = 'hi';
>> string2 = 'there';
>> S = strvcat(string1,string2)

S =

hi
there
5 голосов
/ 18 февраля 2010

Как уже отмечалось, в MATLAB все строки в массиве должны быть одинаковой длины.Чтобы иметь строки разной длины, используйте массив ячеек:

name = {};
for i = somearray
  name = [name; {string}];
end
4 голосов
/ 18 мая 2015

Используйте функцию strcat для добавления с использованием однострочного кода без использования цикла:

A={'food','banana','orange'}

A = 'еда' 'банан' 'апельсин'

A = strcat(A,'s')

A = 'продукты' 'бананы' 'апельсины'

3 голосов
/ 13 апреля 2012
name=[];
for_loop
    filename = 'string';
    name=[name; {filename}];
end
1 голос
/ 18 октября 2016

Для полноты следует также упомянуть новый string класс , представленный в MATLAB R2016b; контейнер для текстовых данных вместе с набором функций для удобной работы с текстом.

Для сравнения с моим другим примером , вот как выделить строковый массив :

N = 10;
names = strings(1,N);
for i=1:N
    names(i) = 'string';
end

А вот как динамически расширить массив без предварительного выделения:

names = strings(0);
for i=1:10
    names(end+1) = 'string';
end

(Конечно, если все строки одинаковы или образуют последовательность с шаблоном, существуют лучшие способы создания массива без цикла. Выше приведен только пример заполнения массива по одному один).

Контейнер string также может преобразовывать в / из массивы символов и массивы ячеек символов .

1 голос
/ 28 июня 2012

Если вы используете два массива, как показано ниже (A и B), вы можете добавить их так же, как вы делаете с другими матрицами.

A = {'a' ; 'b' ; 'c'};
B = {'1' ; '2' ; '3'};
Result = { A{:,1} ; B{:,1} }

Result = 

'a'    'b'    'c'
'1'    '2'    '3'
0 голосов
/ 20 июля 2012

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

   mmm = {'str1'; 'str2'; 'str3'};
   temp = {'a'; 'b'; 'c'};

   mmm = [mmm; temp]

mmm = 

    'str1'
    'str2'
    'str3'
    'a'
    'b'
    'c'
0 голосов
/ 18 февраля 2010

Вы идете правильным путем. Используйте {} для создания массива ячеек, например

stringtable = 'a string';
for i = 1:3
    stringtable = {stringtable;new_string(i)}
end

должен делать то, что вы хотите.

...