【发布时间】:2015-06-24 17:01:06
【问题描述】:
我有一个巨大的矩阵(584064x5369468),我必须在 Matlab 中使用稀疏矩阵,但在我的计算中,为稀疏矩阵赋值非常慢。我迫不及待地想完成它,我该怎么办。
cgm=sparse(584064,5369468);
[Xcp, Ycp, Zcp] = ndgrid(-[1:336],-[1:45],-[1:336]);
% dp my data which is loaded
for sg=1:335
for tg=1:44
for rg=1:335
% ii is a vector i.e the size of ii = 309x1
fprintf('Constructing patch: %i %i %i',sg,tg,rg)
ii=find(abs((Xcp(sg,tg,rg))<=abs(dp(:,1)))&abs((dp(:,1))<abs(Xcp(sg+1,tg,rg)))&(abs(Ycp(sg,tg,rg))<=abs(dp(:,2)))& (abs(dp(:,2))<abs(Ycp(sg,tg+1,rg)))& (abs(Zcp(sg,tg,rg))<=abs(dp(:,3)))&(abs(dp(:,3))<abs(Zcp(sg,tg,rg+1))));
% jj is another vector i.e the size of jj = 64*1
%the ii size is changing every time but the size of jj is always 64. ii is non-zero values and can be between 1 and 584064 .
% c is my matrix after calculation i.e c = 309x64
cgm(ii,jj)=c;
end
end
end
对于第一个内部循环,它运行得非常快,但它变得越来越慢。
我知道给稀疏矩阵赋值意味着重新打包所有东西,而且速度很慢,但是如何在我的代码中减少它的重新打包呢?
谢谢
【问题讨论】:
-
我不明白你在做什么。您没有使用循环变量,我不知道该分配如何与
ii和jj的大小不同。 -
@beaker 我使用循环变量来生成 ii 和 jj 值。我应该更新我的代码吗?
-
我仍然对您的计算感到非常困惑,但是您应该累积每个非零的行、列和值并使用
S = sparse(i, j, v),如图所示here(或者可能是S = sparse(i, j, v, m, n))。 -
@Ehsan - 添加到
ndgrid的那些负面消息以前不存在。不管怎样,谢谢。 -
@Ehsan -
i、j和v都是N x 1向量并填充您的稀疏矩阵C,使得C(i(k), j(k)) = v(k)对应于k = 1, 2, ... , N。所有其他值将为零。我还建议您覆盖大小并执行C = sparse(i, j, v, 584064,5369468);以确保您获得所需的大小。
标签: matlab matrix sparse-matrix