寻找一种更有效的编写MATLAB代码的方法

时间:2015-09-03 02:56:40

标签: matlab

我在MATLAB中写了以下

for i = 1:3

   alpha11(i) = b+a.*randn(1,1);
   alpha22(i) = b+a.*randn(1,1);
   alpha12(i) = b+a.*randn(1,1);
   alpha21(i) = b+a.*randn(1,1);

AoD11(i) = randi([-180/6 +180/6],1,1);
AoA11(i) = randi([-180/6 +180/6 ],1,1);
AoD22(i) = randi([-180/6 +180/6],1,1);
AoA22(i) = randi([-180/6 +180/6 ],1,1);


AoD21(i) = randi([-180 +180],1,1);
AoA21(i) = randi([-180 +180 ],1,1);
AoD12(i) = randi([-180 +180],1,1);
AoA12(i) = randi([-180 +180 ],1,1);


 ctet11(i)= ((2*pi)/lambda)*d*sin(AoD11(i));
 ctet22(i)= ((2*pi)/lambda)*d*sin(AoD22(i));
 ctet12(i)= ((2*pi)/lambda)*d*sin(AoD12(i));
 ctet21(i)= ((2*pi)/lambda)*d*sin(AoD21(i));

 f_t11_ula{i}=transpose((1/sqrt(M))*[ 1 exp(j*ctet11(i)) exp(j*2*ctet11(i)) exp(j*3*ctet11(i))  ]);
 f_t22_ula{i}=transpose((1/sqrt(M))*[ 1 exp(j*ctet22(i)) exp(j*2*ctet22(i)) exp(j*3*ctet22(i))  ]);
 f_t12_ula{i}=transpose((1/sqrt(M))*[ 1 exp(j*ctet12(i)) exp(j*2*ctet12(i)) exp(j*3*ctet12(i))  ]);
 f_t21_ula{i}=transpose((1/sqrt(M))*[ 1 exp(j*ctet21(i)) exp(j*2*ctet21(i)) exp(j*3*ctet21(i))  ]);


 cter11(i)= ((2*pi)/lambda)*d*sin(AoA11(i));
 cter22(i)= ((2*pi)/lambda)*d*sin(AoA22(i));
 cter12(i)= ((2*pi)/lambda)*d*sin(AoA12(i));
 cter21(i)= ((2*pi)/lambda)*d*sin(AoA21(i));

 f_r11_ula{i}=transpose((1/sqrt(O))*[ 1 exp(j*cter11(i)) exp(j*2*cter11(i)) exp(j*3*cter11(i))  ]); 
 f_r22_ula{i}=transpose((1/sqrt(O))*[ 1 exp(j*cter22(i)) exp(j*2*cter22(i)) exp(j*3*cter22(i))]); 
 f_r12_ula{i}=transpose((1/sqrt(O))*[ 1 exp(j*cter12(i)) exp(j*2*cter12(i)) exp(j*3*cter12(i))  ]); 
 f_r21_ula{i}=transpose((1/sqrt(O))*[ 1 exp(j*cter21(i)) exp(j*2*cter21(i)) exp(j*3*cter21(i))]); 



 channel11{i}=  alpha11(i) * f_r11_ula{i}* conj(transpose(f_t11_ula{i})) ;
 channel22{i}= alpha22(i) * f_r22_ula{i}* conj(transpose(f_t22_ula{i})) ;
 channel12{i}= alpha12(i) * f_r12_ula{i}* conj(transpose(f_t12_ula{i})) ;
 channel21{i}= alpha21(i) * f_r21_ula{i}* conj(transpose(f_t21_ula{i})) ;

end 

我在这里写这个问题是为了问我如何压缩这段代码,因为你可以看到它写得不是很好,我基本上有很多重复。我不知道如何用几个命令编写它们。每个命令重复四次,并按11,12,21,22索引。

P.S如果有人想运行代码,则需要以下变量

a = 1;
b = 0; 
M=4;
O = 4; 
lambda=0.15;
d=lambda/2;

期待提出建议。

1 个答案:

答案 0 :(得分:0)

正如@David所说,它可以使用3D数组完成。这消除了大部分代码重复。

以下是如何完成的示例:

sz=[2,2,3];
alpha=b+a.*randn(sz);
AoD = randi([-180/6 +180/6],sz);
AoA = randi([-180 +180],sz);
mask = logical(repmat(eye(2),1,1,3));
[AoA(mask), AoD(~mask)] = deal(AoD(~mask),AoA(mask));
ctet = 2*pi/lambda * d * sin(AoD);
f_t = reshape(arrayfun(@(x) exp(1j*(0:3)'*ctet(x))/sqrt(M),1:12,'UniformOutput',0),sz);
cter = (2*pi)/lambda*d*sin(AoA);
f_r = reshape(arrayfun(@(x) exp(1j*(0:3)'*cter(x))/sqrt(O),1:12,'UniformOutput',0),sz);
channel = reshape(arrayfun(@(x) alpha(x) * f_r{x} * conj(transpose(f_t{x})), 1:12, 'UniformOutput',0),sz);

请注意,对于问题中提到的每个变量,可以使用相应的3D索引访问相同的值。例如,使用上面的代码,之前AoA11(1)中的值现在位于AoA(1,1,1)中。同样,channel11{1}中存储的矩阵现在位于channel{1,1,1}

希望这有帮助。