2016-03-16 2 views
-2

У меня есть эта программа, которая вычисляет реализованную ковариацию для каждого дня в моем примере, но у меня есть некоторые проблемы с сохранением вывода в матрице.Сообщение об ошибке при сохранении вывода из цикла в матрице

программа выглядит следующим образом:

for i=1:66:(2071*66) 

vec = realized_covariance(datapa(i:i+65),data(i:i+65),datapo(i:i+65),data(i:i+65),'wall','Fixed',fixedInterval,5) 

mat(2,4142) = vec 

end 

Выход:

vec = 

    1.0e-03 * 

    0.1353 -0.0283 
    -0.0283 0.0185 

подстрочных несоответствие размера присваивания.

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

Я был бы очень признателен за совет, как решить эту проблему.

+3

Добро пожаловать на переполнение стека! Пожалуйста, не публикуйте повторяющиеся вопросы на сайте. См. [Как спросить] (http://stackoverflow.com/help/how-to-ask). –

+1

Вы можете просто удалить старый вопрос. –

+1

'implement_covariance' не является собственной функцией MATLAB. Пожалуйста, поделитесь кодом этой функции, чтобы мы могли помочь вам. – Adriaan

ответ

0

Вы пытаетесь сохранить матрицу 2 x 2 в один элемент. То есть 4 элемента с правой стороны, один слева. Это не подойдет. Смотрите так: у вас есть гараж, кроме вашего дома, где 1 автомобиль подходит. У вас трое друзей, и они также хотят оставить свой автомобиль внутри. Это проблема, хотя у вас есть только место для одного. Поэтому вам нужно купить более крупный гараж: назначьте 4 элемента слева (например, mat(ii:ii+1,jj:jj+1) = [1 2;3 4]) или используйте массив ячеек/структуры.

Как Steve suggests in a comment below, вы можете использовать 3D матрицу довольно легко:

counters = 1:66:(2071*66); 
mat = zeros(2,2,numel(counters)); %// initialise output matrix 
for ii=1:numel(counters) 
    vec = realized_covariance(datapa(counters(ii):counters(ii+65)),... 
    data(counters(ii):counters(ii+65)),datapo(counters(ii):counters(ii+65)),... 
    data(counters(ii):counters(ii+65)),'wall','Fixed',fixedInterval,5) 
    mat(:,:,ii) = vec; %// store in a 3D matrix 
end 

Теперь mat является 3D, причем первые две координаты быть ваш обычный выходной, i.e.e vec, а последний показатель является номер итерации. Поэтому для доступа к выходу итерации 1032 вы должны сделать mat(:,:,1032), возможно, с squeeze вокруг этого, чтобы сделать его 2D вместо 3D.

+0

Я немного не уверен, как реализовать этот Adriaan или, вернее, я не уверен, как получить матрицу, растущую по мере того, как цикл производит выход. Спасибо за ваш ответ –

+0

Для меня было бы очень естественно использовать следующую матрицу; mat (:, 1: 2), так как это nx2-матрица, насколько я понял, а затем выделяю в ней каждый вывод. Но это не кажется правильным. –

+1

@ KristianNielsen Возможно, рассмотрим матрицу «2-на-2-на-N», например. 'mat = zeros (2,2,2071)' then if 'vec' is' 2-by-2', может хранить его как 'mat (:,:, day_number) = vec'. – Steve

0

Фактически mat(2,4142) - это одно место в матрице, вы не можете присвоить ему четыре значения. Вам нужно определить точное местоположение внутри mat каждый раз, когда вы хотите присвоить ему значения. Попробуйте сделать это так:

mat=zeros(2,2142); 
for k=1:66:(2071*66) 
    vec=realized_covariance(datapa(i:i+65),data(i:i+65),datapo(i:i+65),data(i:i+65),'wall','Fixed',fixedInterval,5) 
    mat(:,[(((k-1)/66)*2)+1 (((k-1)/66)*2)+2])=vec; 

end 
+0

Hi Adiel Благодарим вас за ответ, К сожалению, я все равно получаю такое же сообщение об ошибке. Функция реализованной_ковариации создает матрицу 2x2, и мне нужно получить матрицу 4142x2, содержащую все произведенные выходные данные durin g цикл. –

+0

@ KristianNielsen Ты прав, я его отредактировал. Надеюсь, теперь это сработает! – Adiel

1

Я использовал решение, которое выполняет эту работу.

Я определил матрицу и затем заполняют всю мою выходе один в то время, используя следующее:

A = zeros(0,0) %before loop, only serve to define the storing matrix 

A = [A; vec]%after the calculating function, inside the loop. 
+2

Это также решение. Хорошо для вас, для того, чтобы найти это самостоятельно! Обратите внимание, что хорошей практикой является предварительная выделение матрицы перед циклом (как в ответах @ Adriaan и my), так как увеличение ее на каждой итерации занимает время и память. – Adiel

+0

Спасибо, что сообщили мне Адиэль. Я действительно пробовал это, но когда я это сделал, я закончил тем, что мой вывод был загружен в A в последней определенной строке. Например, я начал с определения A как A = нулей (2071,2), а затем так же, как и выше, но затем я закончил свой вывод, начиная с 2071-й строки. Где я испортил? –

+1

Проблема в том, что вы берете 'A' как есть и добавляете к нему другие данные. поэтому он берет все нули и добавляет 'vec' после этого. В моем ответе я точно определял, где в матрице должны идти данные. – Adiel

 Смежные вопросы

  • Нет связанных вопросов^_^