Ошибка несоответствия размера подзаголовки для переменной 'char'
Я получаю ошибку ??? 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
будет заполнять пробелы по мере необходимости, чтобы создать прямоугольный массив.