ここではループが問題ないと指摘する人もいます。スパースの方がはるかに優れていることを指摘します。あなたの行列はまばらです。そのため、スパースの機能を使用して問題を解決し、行列が大きい場合に備えて大量のストレージを節約してください。
N = 3000;
v = ceil(rand(1,3000)*3000);
tic
A = zeros(N,N);
for i = 1:N
A(v(i),i) = 1;
end
toc
Elapsed time is 0.069082 seconds.
tic
B = sparse(v,1:N,1,N,N);
toc
Elapsed time is 0.001308 seconds.
したがって、マトリックスがまったく大きい場合、時間に大きな違いがあります。
スペースはどうですか?
whos A B
Name Size Bytes Class Attributes
A 3000x3000 72000000 double
B 3000x3000 72008 double sparse
それ以外の場合、行列は同じです。
sum(sum(abs(A - B)))
ans =
0
スパース マトリックスはスペースをほとんど必要とせず、他のマトリックスと同じように使用できます。
MATLAB の機能を使用します。