1

ループが繰り返されるたびに 2x2 行列を生成する再帰的な手順があります。後でこれらの各マトリックスを呼び出すことができるようにしたいのですが、それらをすべて効率的に保存する方法がわかりません。

手順が n 回繰り返される場合、それらを 2nx2 行列に格納する必要がありますか? しかし、この長い行列内の j 番目の行列 (行 2j-1 と 2j) を呼び出すにはどうすればよいでしょうか?

ありがとう!

4

2 に答える 2

1

Rody Oldenhuisは、彼の回答で行列を保存するための 3 つの優れた選択肢を提供しました (私は既に賛成しました)。3つのうち最も遅いものを改善したかっただけです。

MATLAB 行列は行単位ではなく列単位で高速にインデックス付けされるため、背の高い行列 (2*n x 2) ではなく、大きな幅の広い行列 (2 x 2*n) を構築しています。また、反復でのインデックスの構築も簡素化できます。

これがその結果です。もう少し便利なベンチマークを使用します ( File ExchangeのTIMEIT関数が必要になります)。

function [t,b] = test_2d_matrices_container()
    N = 1e5;
    f = {@()func_cell(N), @()func_wide_2d_mat(N), @()func_3d_mat(N)};

    t = cellfun(@timeit, f);
    b = cellfun(@get_mem, f);
end

function b = get_mem(f)
    x = feval(f);    %#ok<NASGU>
    S = whos('x');
    b = S.bytes;
end

function M = func_cell(N)
    M = cell(N,1);
    for i=1:N
        M{i} = rand(2);
    end
end

function M = func_wide_2d_mat(N)
    M = zeros(2,2*N);
    for i=1:2:2*N
        M(:,[i i+1]) = rand(2);
    end
end

function M = func_3d_mat(N)
    M = zeros(2,2,N);
    for i=1:N
        M(:,:,i) = rand(2);
    end
end

私のマシンで得た結果:

>> [t,b] = test_2d_matrices_container
t =
      0.13963      0.22997      0.23434
b =
     9200000     3200000     3200000

「ワイド」な 2D マトリックスの場合は、3D の「スライス」メソッドと同じくらい高速になりました (さらにわずかに高速ですが、違いはごくわずかです)。

于 2013-05-28T23:30:18.517 に答える