如何矢量化将3d矩阵转换为单个矢量的matlab脚本?

时间:2015-03-02 17:28:17

标签: matlab loops nested vectorization

我正在编写差分运算符的数值稳定性的图形表示,我在删除嵌套for循环时遇到问题。代码循环遍历X,Y,平面中的所有条目,并计算每个点的稳定性值。这是通过查找大小取决于输入变量的多项式的根来完成的(输入向量的长度导致大小的多项式3d矩阵(m,n,(输入向量的长度))。主要嵌套for循环是如下。

for m = 1:length(z2)
   for n = 1:length(z1)
        pointpoly(1,:) = p(m,n,:);
        r = roots(pointpoly);
        if isempty(r),r=1e10;end
        z(m,n) = max(abs(r));
    end
end

示例数值方法(梯形法则)的完整代码如下。任何和所有的帮助表示赞赏。

alpha = [-1 1];
beta = [.5 .5];
Wind = 2;
Wsize = 500;
if numel(Wind) == 1
    Wind(4) = Wind(1);
    Wind(3) = -Wind(1);
    Wind(2) = Wind(4);
    Wind(1) = Wind(3);
end
if numel(Wsize) == 1
    Wsize(2) = Wsize;
end
z1 = linspace(Wind(1),Wind(2),Wsize(1));
z2 = linspace(Wind(3),Wind(4),Wsize(2));
[Z1,Z2] = meshgrid(z1,z2);
z = Z1+1i*Z2;
p = zeros(Wsize(2),Wsize(1),length(alpha));
for n = length(alpha):-1:1
    p(:,:,(length(alpha)-n+1)) = alpha(n)-z*beta(n);
end
for m = 1:length(z2)
    for n = 1:length(z1)
        pointpoly(1,:) = p(m,n,:);
        r = roots(pointpoly);
        if isempty(r),r=1e10;end
        z(m,n) = max(abs(r));
    end
end
figure()
surf(Z1,Z2,z,'EdgeColor','None');
caxis([0 2])
cmap = jet(255);
cmap((127:129),:) = 0;
colormap(cmap)
view(2);
title(['Alpha Values (',num2str(alpha),') Beta Values (',num2str(beta),')'])

EDIT :: 我能够使用reshape命令删除其中一个for循环。所以;

for m = 1:length(z2)
   for n = 1:length(z1)
        pointpoly(1,:) = p(m,n,:);
        r = roots(pointpoly);
        if isempty(r),r=1e10;end
        z(m,n) = max(abs(r));
    end
end 

现在已成为

gg = reshape(p,[numel(p)/length(alpha) length(alpha)]);
r = zeros(numel(p)/length(alpha),1);
for n = 1:numel(p)/length(alpha)
    temp = roots(gg(n,:));
    if isempty(temp),temp = 0;end
    r(n,1) = max(abs(temp));
end

z = reshape(r,[Wsize(2),Wsize(1)]);

这可能是一个循环,但我仍然经历相同数量的元素。有没有办法在我的所有行上同时使用roots命令?

0 个答案:

没有答案