2012-03-01 846 views
0

我目前的代码如下。两个for循环(嵌套),计算矩阵Matlab

我所拥有的是两套数据phi和theta都是18x30,我有一个从1到30的运行循环,这是我的数据的30列。这些单独的列中的每一列都会为我生成一个矩阵“B”。矩阵'B'在经过每列的18行之后产生。

我遇到的问题是,我需要将18行中的每一行的所有“B”矩阵相乘,以便为30列中的每列获得最终矩阵,这就是为什么我设置了A(:,:,i)= eye(2),这样我的第一个矩阵将乘以A.但我不想为每个循环存储A或B,而是我想要的是在第一个循环我的矩阵B将乘以单位矩阵A.然后,矩阵A将乘以下一个矩阵B ...,每个乘法的结果被传送到将要计算的下一个矩阵B,所以乘法将作为程序循环。这就是为什么我有这条线:

A(:,:,i) = A.*B; 

但它似乎并没有工作。我收到一条错误消息,说明尺寸必须匹配。

在程序结束时,我希望能够使用如下命令访问30个矩阵中的每一个,例如: A(:,:,3),例如,为第3列获得我的2x2矩阵。

希望已经够清楚了!

theta = dlmread('theta.dat'); 
phi = dlmread('phi.dat'); 

ne = 1.7; 
no = 1.5; 
d = 0.000001; 
w = 0.000000555; 

for i = 1:30 
     A(:,:,i) = eye(2); 

for j = 1:18  

    nx =((cos(theta(j,i)).^2)/(no^2) + ((sin(theta(j,i)).^2)/(ne^2))).^(-1/2); 
    D = (2*pi*(nx-no)*d)/w; 

    x = ((cos(phi(j,i))).^2).*exp((-1i.*D)/2) + ((sin(phi(j,i))).^2).*exp((1i.*D)/2); 
    y = 1i*(sin(D/2)).*sin(2*phi(j,i)); 
    z = ((cos(phi(j,i))).^2).*exp((1i.*D/2) + ((sin(phi(j,i))).^2).*exp((-1i.*D)/2)); 

    B = [x y;y z]; 
    A(:,:,i) = A.*B; 

end 

end 

回答

1

B是2x2矩阵。对于A.*B的工作,A也必须是2x2。但您的程序中的A是三维的。

从您的问题描述,我想你想

A(:,:,i) = A(:,:,i)*B; % Edited now that I see this happens 18 times on the same i 

(请注意,我也取代逐元素乘法.*与矩阵相乘*,因为这是它听起来像你想要的。)


但我建议

A = eye(2); 

A = A*B; 

,并将其存储在像

results(:,:,i) = A; 
+0

您好,感谢您的答复结束,但我得到的错误消息:试图引用非结构阵列的字段为该线路的代码。我只需要一个2D矩阵,但是将第三维引入的唯一原因是能够访问我所有的30个矩阵。 – Awa786 2012-03-01 19:33:20

+0

哎呀抱歉,现在用这个A运行它(:,:,i + 1)= A(:,:,i)* B;并且我收到一条错误消息:不正确的索引矩阵参考 – Awa786 2012-03-01 19:38:32

+0

现在它工作了,我刚刚犯了一个打字错误。但我没有得到期望的结果,我希望能够使用A(:,...,1 ... 30)调用30个矩阵,但是每次都得到相同的矩阵,看起来很奇怪.. – Awa786 2012-03-01 19:51:20