Vectorize用于单元格数组赋值:如何避免多个for循环或嵌套for循环?

时间:2016-08-25 07:58:38

标签: arrays matlab optimization vectorization

在MATLAB中,我c是之前计算过的大型稀疏矩阵,并希望通过使用D列的外积来为单元数组c赋值。但是,我必须实现特殊规则,并且不能获得相同c列的外部产品。

从第1列开始,使用第一个for循环,我必须实现另一个for循环和if-else语句(用于“标记”,因为我在第二个for循环中增加索引)以避免相同{{的外部产品1}}列。

最后,在嵌套for循环之后,我想将所有c加起来以获得矩阵D。这是我的第一个版本和背后的想法:

K

我知道如何删除嵌套循环,但反过来我仍然需要在第一层上有多个for循环,并且性能不是太强。我一直在考虑使用c = rand(100,100); D = cell(1,100); D{1} = eye(100); for i = 1:100 flag = false; for z = 2 :100 j = z-1; if j == i flag = true; end if flag == true D{z} = (c(:,j+1)*c(:,i)'); else D{z} = (c(:,j)*c(:,i)'); end end for z = 2 : 100 K = K + D{z}'; end end NDGRID来做这件事,但无济于事。

1 个答案:

答案 0 :(得分:0)

好的,我得到了一些东西;你检查要采取哪些向量,然后创建99个产品,然后将它们相加。我将获得99个向量,将它们相加然后创建产品,作为 b + a c = a *(b + c)。在您的代码中,这将使:

c=rand(100,100);
D = cell(1,100);
D{1} = eye(100);
K=zeros(100);
tic
for i = 1:100
        flag = false;
        for z = 2 :100
            j = z-1;
            if j == i
               flag = true;
               FLAGMATRIX(i,j)=true;
            end 
            if flag == true
               D{z} = (c(:,j+1)*c(:,i)');
            else 
               D{z} = (c(:,j)*c(:,i)');
            end
        end
         for z = 2 : 100
             K = K + D{z}';
         end
end
toc
Matrix=zeros(100);
tic
for i=1:100
    %creating 1:100 the vector w/o i
    vector=1:100;
    vector(i)=[];
    %sum up the 2nd dimension
    sumvec=sum(c(:,vector),2);
    Matrix=[Matrix + c(:,i)*sumvec'];
end
toc

你可以在代码中缩短它,但这不会改变性能

Matrix2=zeros(100);
tic
for i=1:100
    sumvec=sum(c(:,[1:i-1 i+1:100]),2);%vector creation + sum
    Matrix2=[Matrix2 + c(:,i)*sumvec'];
end
toc

在我的机器上执行

Elapsed time is 0.527004 seconds.
Elapsed time is 0.006401 seconds.
Elapsed time is 0.007078 seconds.

这可能并不重要,但您和我在e-13部门的成绩之间存在差异。然而,我认为,如果数字来自大致相同的范围,那么我将更接近现实,总结起来不会造成伤害,无论如何计算产品必须在某处完成