合計で10000のうち100の非ゼロ要素(つまり、1%の非ゼロのみ)を持つ行列は、スパースとして保存するのが最適です。matlabの機能を使用します。
A = sparse(1:100,Z,1,100,100);
これは、すてきでクリーンな1線形であり、完全な行列よりも効率的に格納される行列になります。それでも行列の乗算に使用でき、その点でもより効率的です。例えば...
Z = randperm(100);
A = sparse(1:100,Z,1,100,100);
whos A
Name Size Bytes Class Attributes
A 100x100 2408 double sparse
これにより、メモリがほぼ40対1に削減されます。また、これらの処理が進むにつれてマトリックスは実際にはかなり小さくなりますが、スパースとして使用する方が高速です。
B = rand(100);
timeit(@() B*A)
ans =
4.5717e-05
Af = full(A);
timeit(@() B*Af)
ans =
7.4452e-05
Aが1000x1000だったとしたら、節約はさらに重要だったでしょう。
目標が完全な行列である場合は、fullを使用して完全な行列に変換できます。または、accumarrayはオプションです。また、既存の配列に値を挿入する場合は、sub2indを使用します。