2014-05-03 2 views
0
for n=1:1:20 
    et1(:,n) = 0 
    for m=1:1:5 

     et2(:,n) = (exp(t*(-n/tau)).*((t*(n/tau)).^(m*n-1))/(factorial(m*n - 1)))*(n); 
     et1(:,n) = (exp(t*(-n/tau)).*((t*(n/tau)).^(m*n-1))/(factorial(m*n - 1)))*(n) + et1(:,n); 

    end  
end 

Я не могу понять, почему эта ошибка отображается. t - вектор размерности 369. et2 работает правильно и дает правильные значения. tau - постоянная.Несоответствие размеров Matlab

+0

почему вы 'et1 (:, п) = 0 'является первым цикл? – bla

+0

его в основном et1 (:, n) = et2 (:, n) + et1 (:, n) для m = 1: 1: 5 – Zirael

+0

, так зачем вам цикл for? просто 'et1 = et2 + et1' – bla

ответ

0

Вы получаете эту ошибку из MATLAB, поскольку, как natan намекнул вам в своем первом комментарии, вы не инициализировать переменную et1 (или может быть, вы сделали, но с неправильным размером). В вашей строке:

et1 (:, n) = 0;

Matlab не может знать о том, сколько строк он должен применить команду (это Nth столбец из et1) = 0.

Простой способ решить это предварительно инициализировать переменный перед FOR цикла (и если вы знаете размер заранее, это также хорошая практика в любом случае, MATLAB быстрее этот путь). Поэтому, прежде чем ваш двойной для петли, вставить что-то вроде:

nColumn = 20 ; 
et1 = zeros(length(t) , nColumn) ; 

Этот путь не более индексируются размер назначение несовпадение ошибка, и вы также можете избавиться от выражения et1 (:, п) = 0 ; в вашей петле, потому что все элементы et1 уже инициализированы 0.

Затем по вашим расчетам. В вашей самой внутренней петле вы вычисляете выражение для et2 пять раз (для m = от 1 до 5), но каждый раз, когда вы записываете результат в том же месте (столбец Nth et2). В результате вы сохраните только последний расчет (для m = 5) в колонке et2.
Если вы хотите сохранить результат выражения для каждого из пяти значений m, вам нужно будет добавить измерение к своей матрице.
Однако, если et2 был предназначен только для временного использования, чтобы добавить его результат для каждого значения m в столбец et1, то вы можете полностью избавиться от него (или просто использовать временный вектор столбца).

Если я правильно понял ваш код и ваше намерение, то следующий код должен работать для вас:

//% initialize your matrix 
nColumn = 20 ; 
et1   = zeros(length(t) , nColumn) ; 
et2_tempCol = zeros(length(t) , 1) ; 

//% Run the loop 
for n=1:nColumn 
    for m=1:1:5 
     et2_tempCol(:) = (exp(t*(-n/tau)).*((t*(n/tau)).^(m*n-1))/(factorial(m*n - 1)))*(n) ; 
     et1(:,n) = et2_tempCol + et1(:,n); 
    end  
end 

Обратите внимание, что я использую только временную переменную et2_tempCol и назначение (:) индекса, чтобы убедиться, что воля будет Проходит колонна вектора к et1 .Это может позаботиться о любой форме вашего вектора t (будь то св линии или колонка вектором) , В противном случае Matlab может рассердиться и выбросить еще Размеры матрицы должны соответствовать Ошибка у вас.

Если вы контролируете размер вашего вектора t (линии или колонке) и не нужно, чтобы сохранить результат et2 на всех, то вы можете избавиться от него полностью, используя в своем внутреннем цикл:

если t является линии вектор:

et1(:,n) = ((exp(t*(-n/tau)).*((t*(n/tau)).^(m*n-1))/(factorial(m*n - 1)))*(n)).' + et1(:,n); 

t, если это колонка вектор:

et1(:,n) = ((exp(t*(-n/tau)).*((t*(n/tau)).^(m*n-1))/(factorial(m*n - 1)))*(n)) + et1(:,n); 
Смежные вопросы