次の形式の非常に大きなマトリックスを生成したいと思います。
[[1,2,3]
,[2,3,4]
,[3,4,5]
...
,[n,n+1,n+2]]
n の値が 100 万以上の場合。matlab/octave でこれを行うにはどうすればよいですか?
私は関数型プログラミングに慣れており、そこから大きなリストを生成し[1..n]、変換関数をそのリストにマップします。matlab/octave には、大きな行列を生成するための同様のイディオムがあると思いますが、何も見つかりません。
rとを目的の行列cの行数と列数にすると、
M = bsxfun(@plus, 0:c-1, (1:r)');
これはうまくいくはずです:
n=100000;
A=[[1:n]' [2:n+1]' [3:n+2]'];
A=zeros(n, 3);
for column=1:3
for row=1:n
A(row, column) = n + column - 1;
end
end
それを試してみてください。最初にすべてゼロの行列を作成します。これは、各反復で行列を動的に更新するよりもはるかに効率的であるためです。特に非常に大きな行列の場合。Matlab はベクトルを列優先順に格納するため、内側の for ループで行を反復処理する必要があるため、列を反復処理する場合のように、これらの操作を実行するために Matlab がキャッシュとメイン メモリの間を行き来する必要がありません。内側の for ループで。(それでも頻度はかなり減ります)。
さらに別のオプション:
bsxfun(@plus,cumsum(ones(n,1)),[0 1 2]);