Ошибка несоответствия размера подзаголовки для переменной 'char'

1 [2012-04-11 23:00:00]

Я получаю ошибку ??? Subscripted assignment dimension mismatch. ??? Subscripted assignment dimension mismatch. когда значение days достигает 13 потому что, вероятно, размер столбца legend_vec для 7-й строки достигает 13.

days = [1     2     3     4     5     6    13];
for i=1:nTime
    legend_vec(i,:)=(['After ',num2str(days(i)),' days']);
end

Как я могу избежать ошибки и хранить все дни, пока я legend_vec в legend_vec? Благодарю.

dimension char matlab store


2 ответа


1 Решение ely [2012-04-11 23:11:00]

Когда вы пытаетесь сохранить составную строку в массиве, она сохранит ее как список номеров символов Ascii или Unicode. Поэтому, если я попытаюсь вставить строку "Hello world" в качестве первой строки массива, то эта первая строка будет на самом деле:

>>> my_strs = []; 
>>> my_strs(1,:) = "Hello world"
my_strs =

72   101   108   108   111    32   119   111   114   108   100

Обратите внимание, что это неявно делает my_strs в my_strs 1 на 11. Если я попытаюсь добавить строку как вторую строку, но она не оценивает наличие 11 кодов символов длины, это даст ошибку:

>>> my_strs(2,:) = "Hi there"
error: A(I,J,...) = X: dimensions mismatch

Таким образом, вам нужно добавить лишние пробелы для заполнения всех ваших дней, когда они станут строками (так что все ваши строки имеют равномерную длину) или сделать что-то более удобное, например, хранить все строки в массиве ячеек, где они могут иметь разную длину,

Чтобы сделать это с помощью массива ячеек, вы сделали бы что-то вроде этого:

>>> my_strs = {};
>>> my_strs{1} = "Hello world"
my_strs =

{
  [1,1] = Hello world
}

>>> my_strs{2} = "Hi there"
my_strs =

{
  [1,1] = Hello world
  [1,2] = Hi there
}

>>> my_strs{1,1}
ans = Hello world
>>> my_strs{1,2}
ans = Hi there

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

Полное раскрытие: я тестирую вышеуказанный код с помощью Octave, потому что лично я предпочитаю бойкотировать Matlab. Вы можете спросить в мета или что-то, если вам интересно, почему это так, но для целей этого вопроса я не думаю, что тестирование в Octave имеет какое-то значение в правильном ответе.


1 Pursuit [2012-04-11 23:22:00]

Используйте массив ячеек строк. Ячейки ячеек (определенные символами {}) предназначены для обработки массивов разнородных объектов, например, разных типов данных или разных строк длины.

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

days = [1     2     3     4     5     6    13];
for i=1:length(days)
    legend_cell{i,:}=(['After ',num2str(days(i)),' days']);
end

Так как это обычное использование, команда legend может принять это как вход.

plot(randn(10,7),'.')
legend(legend_cell)

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

thirdString = legend{3};

Или, если вы абсолютно должны иметь прямоугольный массив символов, Matlab поддерживает следующее соглашение, чтобы вернуть вас туда, где вы начали:

legend_vec_in_chararray = char(legend_cell);  

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