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是一个常数。
答案 0 :(得分:0)
你从matlab收到这个错误,因为natan在他的第一条评论中暗示你,你没有初始化你的变量 et1 (或者你可能做错了,但错了尺寸)。在你的行中:
et1(:,n)= 0;
Matlab无法知道有多少行应用指令(et1的第n列)= 0 。
解决这个问题的简单方法是在 FOR 循环之前预先初始化变量(如果事先知道大小,无论如何也是好的做法 ,matlab这种方式更快)。因此,在双 for 循环之前,插入类似于:
的内容nColumn = 20 ;
et1 = zeros( length(t) , nColumn ) ;
这样就不再有 Subscripted assignment dimension mismatch 错误了,你也可以在你的循环中删除你的表达式 et1(:,n)= 0; ,因为所有 et1 的元素已初始化为0。
然后进行计算。在最内层循环中,您计算et2
五次的表达式(对于 m
= 1到5),但每次将结果写在同一位置时( et2
)的第N列。因此,您只需在m
列中保存上次计算( et2
= 5)。
如果要为 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可能会生气并向您发送另一个 Matrix维度必须同意错误。
如果您控制向量 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);