在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
来做这件事,但无济于事。
答案 0 :(得分:0)
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部门的成绩之间存在差异。然而,我认为,如果数字来自大致相同的范围,那么我将更接近现实,总结起来不会造成伤害,无论如何计算产品必须在某处完成