Matlab维度不匹配

时间:2014-05-03 07:18:15

标签: matlab for-loop

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是一个常数。

1 个答案:

答案 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);