Озадачивает «Subscripted assignment dimension mismatch» только во время цикла с использованием portopt & ewstats
Я рву на себе волосы из-за этого.
У меня есть набор ежедневных доходностей 4 активов, используя 10-дневное окно, которое я перебираю по всему набору данных (от i = 1 до 50), выполняя ряд вычислений и создавая оптимальные портфели. Это включает в себя использование portopt .
Входные сигналы, ExpReturn и ExpCovariance генерируются с использованием ewstats
Теперь, на последней 50-й итерации (и только 50-й-все предыдущие работают нормально), я получаю следующую ошибку:
Обратите внимание, что я не вижу проблемы с RetSeries , поскольку ExpReturn и ExpCovariance , созданные ewstats , имеют размер и соответственно.
Я пробовал все, что мог придумать, чтобы выследить ошибку, включая проверку size() , использование точек останова,предварительное распределение матриц и т. д. и т. д. Как ни странно, если я удалю цикл, установите i = 50 , он работает. Кроме того, если вместо ewstats я просто использую mean() и cov() — они работают на 50-й итерации. Если я заменю один, например, ExpReturn на mean(RetSeries) , он работает. Аналогично, замена ExpCovariance на cov(RetSeries) -работает. Но и ExpReturn , и ExpCovariance вместе всегда терпят неудачу.
Что вызывает ошибку?
Используя dbstop if error , я вижу:
Итак, проблема заключается в PortWts , но я не понимаю, почему сейчас это не правильные размеры, когда это было для 49 других итераций. Кроме того, оскорбительная строка ошибки-это первая точка в цикле PortWts , поэтому ничего не происходит с ней заранее
1 ответ
В большинстве случаев MATLAB, которые я использовал, всякий раз, когда у меня была ошибка в моем коде, сообщение об ошибке в окне командной строки показывало номер строки. Однако на компьютере, который я сейчас использую, он показывает мне только следующее: . Subscripted assignment dimension.
При попытке использовать решатель генетического алгоритма в MATLAB, я получаю следующую ошибку Subscripted assignment dimension mismatch: сообщение об ошибке Pastebin Теперь он говорит, что ошибка связана с функцией фитнеса в конце, но когда я тестирую свою функцию фитнеса отдельно, она работает.
Попробуйте установить dbstop if error и снова запустите код. MATLAB перейдет в режим отладки в точном месте возникновения ошибки.
Вот скринкаст Дуга Халла, показывающий, как
Изменить ошибочную строку в:
затем назначьте каждому по отдельности:
Теперь, когда он терпит неудачу, он покажет вам, какой именно выход не имеет ожидаемого размера. В сочетании с вышеприведенным трюком теперь вы можете проверить переменные в своем рабочем пространстве во время ошибки и выяснить, что не так..
EDIT2
Кроме того, добавьте следующий тест между ними (перед назначением):
Похожие вопросы:
У меня есть разное распределение для разных времен ( t ) с каждым распределением, имеющим 10,000 элементов. У меня есть следующая строка кода, которая вычисляет CDF для различных распределений.
Я новичок в этом форуме. Позвольте мне начать: я работаю на MATLAB и постоянно получаю ошибки. Наконец-то я нашел такой хороший форум, как ваш. Моя проблема заключается в следующем: у меня есть.
Рассмотрим следующий код, который составляет случайный набор данных и соответствует полиномам порядка от 1 до 5 против данных: x=1:100; data=exp(-rand(1).*x); for ii = 1:1:5; polyfit(x,data,ii); end.
В большинстве случаев MATLAB, которые я использовал, всякий раз, когда у меня была ошибка в моем коде, сообщение об ошибке в окне командной строки показывало номер строки. Однако на компьютере.
При попытке использовать решатель генетического алгоритма в MATLAB, я получаю следующую ошибку Subscripted assignment dimension mismatch: сообщение об ошибке Pastebin Теперь он говорит, что ошибка.
Я попытался повернуть это: for r=1:fsize for c=1:fsize mask(r,c) = exp(-(((r-centre)^2+(c-centre)^2)/2*(sigma^2))); end end в mask(1:fsize,1:fsize) =.
В директории у меня есть коллекция из 20 файлов. Я хочу: повторите цикл по этим 20 файлам, извлеките из них x и y данных и поместите эти данные в матрицу 2D, созданную в цикле Обратите внимание, что.
Я новичок в Matlab и программировании в целом. Я пытаюсь написать цикл for, где я могу сохранить сгенерированные векторы неравномерной длины в матрицу. Вот мой основной цикл: G1 = [1 2 3 4]; for G1.
Обращение? array(1:3) = cellArray<1:3>; % this fails: Subscripted assignment dimension mismatch. примечание: Я знаю, как сделать это в цикле. Ищу matlab прямой маршрут. %% Содержание cellArray %%.
Ошибка несоответствия размера подзаголовки для переменной ‘char’
Я получаю ошибку . Subscripted assignment dimension mismatch. . Subscripted assignment dimension mismatch. когда значение days достигает 13 потому что, вероятно, размер столбца legend_vec для 7-й строки достигает 13.
Как я могу избежать ошибки и хранить все дни, пока я 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 на 11. Если я попытаюсь добавить строку как вторую строку, но она не оценивает наличие 11 кодов символов длины, это даст ошибку:
Таким образом, вам нужно добавить лишние пробелы для заполнения всех ваших дней, когда они станут строками (так что все ваши строки имеют равномерную длину) или сделать что-то более удобное, например, хранить все строки в массиве ячеек, где они могут иметь разную длину,
Чтобы сделать это с помощью массива ячеек, вы сделали бы что-то вроде этого:
Это должно быть просто, чтобы сопоставить это с условными условными обозначениями, которые вы используете, в цикле, который вы показываете в вопросе выше.
Полное раскрытие: я тестирую вышеуказанный код с помощью Octave, потому что лично я предпочитаю бойкотировать Matlab. Вы можете спросить в мета или что-то, если вам интересно, почему это так, но для целей этого вопроса я не думаю, что тестирование в Octave имеет какое-то значение в правильном ответе.
1 Pursuit [2012-04-11 23:22:00]
Используйте массив ячеек строк. Ячейки ячеек (определенные символами <> ) предназначены для обработки массивов разнородных объектов, например, разных типов данных или разных строк длины.
Чтобы использовать массивы ячеек, измените код следующим образом:
Так как это обычное использование, команда legend может принять это как вход.
Для других целей вы можете получить доступ к отдельным строкам, используя обозначение:
Или, если вы абсолютно должны иметь прямоугольный массив символов, Matlab поддерживает следующее соглашение, чтобы вернуть вас туда, где вы начали:
Функция char будет заполнять пробелы по мере необходимости, чтобы создать прямоугольный массив.