在Matlab中进行稀疏矩阵迭代装配的最佳方法?
我的代码需要在循环中修改稀疏矩阵的元素。执行此操作时,matlab警告我,此稀疏索引表达式可能很慢。我正在使用Spalloc函数预分配稀疏数组,但仍然收到此警告。组装稀疏矩阵的最佳方法是什么?这就是我目前正在做的事情在Matlab中进行稀疏矩阵迭代装配的最佳方法?,matlab,sparse-matrix,Matlab,Sparse Matrix,我的代码需要在循环中修改稀疏矩阵的元素。执行此操作时,matlab警告我,此稀疏索引表达式可能很慢。我正在使用Spalloc函数预分配稀疏数组,但仍然收到此警告。组装稀疏矩阵的最佳方法是什么?这就是我目前正在做的事情 K=spalloc(n,n,100); f=spalloc(n,1,100); for i = 1:Nel [Ke,fe] = myFunction(Ex(i),Ey(i)); inds = data(i,2:end); K(inds,inds) = K(inds,i
K=spalloc(n,n,100); f=spalloc(n,1,100);
for i = 1:Nel
[Ke,fe] = myFunction(Ex(i),Ey(i));
inds = data(i,2:end);
K(inds,inds) = K(inds,inds) + Ke;
f(inds) = f(inds)+fe;
end
inds中的索引可能会在循环中出现多次,这意味着K或f中的一个元素可能会收到多个贡献。循环中的最后两行是我收到警告的地方 常用的方法是使用
sparse
构造函数:
S=稀疏(i,j,v,m,n)
i
和j
是行和列索引向量,v
是相应的数据向量。与重复索引对应的值会像代码一样求和。因此,您可以将行和列索引向量与数据向量一起构建,然后用它们调用sparse
例如:
nout=Nel*(大小(数据,2)-1);
%K的数据向量
Kdata=零(1,零);
%f的数据向量
fdata=零(1,零);
%K和f的索引向量
sparseIdxvec=一(1,零);
outIdx=1;
对于i=1:Nel
[Ke,fe]=myFunction(Ex(i),Ey(i));
inds=数据(i,2:结束);
nidx=numel(inds);
outIdxvec=outIdx:outIdx+nidx-1;
sparseIdxvec(outIdxvec)=inds;
Kdata(outIdxvec)=Ke;
fdata(outIdxvec)=fe;
outIdx=outIdx+nidx;
结束
K=稀疏(sparseIdxvec,sparseIdxvec,Kdata,n,n);
f=稀疏(sparseIdxvec,1,fdata,n,1);
根据您的应用程序,这可能更快,也可能更快。要获得您正在做的事情的大致数字,您的
n
、Ne1
值是多少,以及Ke
和fe
的密度是多少(意味着哪个百分比不是零?)。