Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中进行稀疏矩阵迭代装配的最佳方法?_Matlab_Sparse Matrix - Fatal编程技术网

在Matlab中进行稀疏矩阵迭代装配的最佳方法?

在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

我的代码需要在循环中修改稀疏矩阵的元素。执行此操作时,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,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
的密度是多少(意味着哪个百分比不是零?)。