Matlab - 如何提高两端口矩阵计算的效率?

时间:2014-06-09 03:04:27

标签: matlab matrix performance

我正在寻找一种方法来加速一些简单的双端口矩阵计算。请参阅下面的代码示例,了解我目前正在做什么。本质上,我首先创建一个[Nx1]频率向量。然后我遍历频率向量并创建[2x2]矩阵H1和H2(f的所有函数)。一些简单的矩阵数学,包括一个矩阵左分区' \'之后,我得到了我的结果pb作为[Nx1]向量。问题是循环 - 计算需要很长时间,我正在寻找提高计算效率的方法。我尝试使用[2x2xN]传输矩阵来组装问题,但是mtimes操作无法处理3-D乘法。

任何人都可以告诉我如何在不需要循环f的情况下进行这样的计算吗?

非常感谢:svenr

%计算频率和波数矢量

f = linspace(20,200,400);
w = 2.*pi.*f;

每个频率的计算百分比

for i=1:length(w)

   H1(i,1) = {[1, rho*c*k(i)^2 / (crad*pi); 0,1]};
   H2(i,1) = {[1, 1i.*w(i).*mp; 0, 1]};
   HZin(i,1) = {H1{i,1}*H2{i,1}};
   temp_mat = HZin{i,1}*[1; 0];
   Zin(i,1) = temp_mat(1,1)/temp_mat(2,1);
   temp_mat= H1{i,1}\[1; 1/Zin(i,1)];
   pb(i,1) = temp_mat(1,1); Ub(i,:) = temp_mat(2,1);
end

1 个答案:

答案 0 :(得分:0)

假设length(w) == length(k)返回true,rho , c, crad, mp都是标量,最后一行是Ub(i,1) = temp_mat(2,1)而不是Ub(i,:) = temp_mat(2,1);

 temp = repmat(eyes(2),[1 1 length(w)]);
 temp1(1,2,:) = rho*c*(k.^2)/crad/pi;
 temp2(1,2,:) = (1i.*w)*mp;
 H1 = permute(num2cell(temp1,[1 2]),[3 2 1]);
 H2 = permute(num2cell(temp2,[1 2]),[3 2 1]);
 HZin =  cellfun(@(a,b)(a*b),H1,H2,'UniformOutput',0);
 temp_cell = cellfun(@(a,b)(a*b),H1,repmat({[1;0]},length(w),1),'UniformOutput',0);
 Zin_cell = cellfun(@(a)(a(1,1)/a(2,1)),temp_cell,'UniformOutput',0);
 Zin = cell2mat(Zin);
 temp2_cell = cellfun(@(a)({[1;1/a]}),Zin_cell,'UniformOutput',0);
 temp3_cell = cellfun(@(a,b)(pinv(a)*b),H1,temp2_cell);
 temp4 = cell2mat(temp3_cell);
 p(:,1) = temp4(1:2:end-1);
 Ub(:,1) = temp4(2:2:end);