我正在寻找一种方法来加速一些简单的双端口矩阵计算。请参阅下面的代码示例,了解我目前正在做什么。本质上,我首先创建一个[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
答案 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);