2

視覚的にコードなし:

Iteration i              result j1                  result j2
     1                   10 15 20 15 25                2 
     2                   5                             8
     .                   . . .                         .
     .                   . . . . . .                   .
     i           j1 with length(x), x=0:100        j2 with length == 1

より良い表現のために編集します:

                [10 15 20 15 25]          [1]                (i=1)
                [5]                       [2]                (i=2)
Matrix(i) = [   [. . . . . . . ]          [3]          ]
                [..]                      [.]
                [j1 = size (x)]     [j2 size 1 * 1]          (i=100)

so Matrix dimension is: i (rows) * 2 (columns) 

(p.e for i = 1, j1 with size(x) column 1 on row 1, j1 size (1) column 2 on row 1)

比較に使用するために、各反復結果をマトリックスに保存したいと思います。これは行列で行うことができますか、それともセル配列で行うことができますか?参考のために例を書いてください。

前もって感謝します。

4

3 に答える 3

2

cell制約が少なく、よりクリーンで直感的な実装を実現するには 、配列を使用します。

nIterations = 500;
J = cell(nIterations, 2);
for i=1:nIterations
    length_x = randi(100); % random size of J1
    J{i,1} = randi(100, length_x, 1); % J1
    J{i,2} = randi(i); % J2
end

さらに、次のような追加の利点があります。

  • cell 配列に沿って、および cell 配列内の要素にアクセスする

    J{10, 1}; J{10, 2};

  • 全体の構造を変更せずに各要素内で追加/変更

    J{10, 1} = [J{10, 1}; 0]

  • 通常の配列のように、配列に追加 (反復を追加)

    J{end+1, 1} = 1; J{end, 2} = 1

  • を使用して各エントリ (ベクトル) に関数を適用します。cellfun

    length_J = cellfun(@length, J); % J1 の数値/長さを取得
    mean_J = cellfun(@mean, J); % J1 の平均を取得

于 2012-11-19T23:50:05.130 に答える
2

編集: 比較のためにプロファイリングまでスクロールします。(これにより、セル実装の勝利がレンダリングされます。)


i行と 101 列 (最初の 100 の j1 の値、必要に応じて s (*) で埋められ、次に j2 の値)を持つ行列を使用NaNできるため、明確な表現であれば簡単に比較できます。 . つまり、101 列を使用して、j1 が NaN で終わらないことを確認します。

(*){NaN または 0 のどちらが便利かによる}

また、最初の列が j1 の長さを示し、次に j1 の値、その後に NaN、j2 の値が続く102 列を実行することもできます。
と言うj1=[3 1 10 5]j2=2、対応する行は[4 3 1 10 5 NaN ... NaN 2]です。

このマトリックスアプローチの利点は

  • Matlabは固定サイズの行列の処理に非常に優れているため、セルよりも高速である必要があります(行数が多すぎない場合)。
  • また、基本的な操作 (比較など) のプログラミングは少し簡単です。(2 つのベクトルを比較するだけでよく、同じ行で複数の比較を行うことができます。)

マトリックスアプローチの逆のことは次のとおりです。

  • j1に簡単に追加することはできません(まあ、102列のアプローチを行うと少し簡単になります)、
  • j1 のサイズには制限があります。(この場合、100)

全体として、セルは一般的に遅く、プログラミングに時間がかかる可能性がありますが、より柔軟です。
これがあなたを正しい方向に導くことを願っています。

編集:

2 つの行列を使用する 3 番目のアプローチ:

j1results = zeros( n_iterations, maxlen_j1 );
j2results = zeros( n_iterations, 1);

次に、計算は次のようになります。

[j1results(k,:), j2results(k)] = compute(k);

ここで、compute は 2 つの異なる値を返す関数です。


プロファイリング:

function [J1,J2] = compute(k)
    J1 = zeros(1,100); %this is necessary
    % some dummy assignments
    len = randi(100,1);
    J1(1:len) = k*ones(1,len);
    J2 = k;
end

function res = compute_cell(k) % for the cell-solution
    res = cell(1,2);
    len = randi(100,1);
    res{1} = k*ones(1,len);
    res{2} = k;
end

n=100000;

tic;
J12 = cell(n,2);
for i=1:n
    J12{i}=temp_cell(i);
end
toc

tic;
J1 = zeros(n,100);
J2 = zeros(n,1);
for i=1:n
    [J1(i,:), J2(i)] = temp(i);
end
toc

結果:

Elapsed time is 2.437634 seconds.
Elapsed time is 2.741491 seconds.

(また、不必要なメモリ空間を割り当てるというマトリックス実装の欠点が支配的ではない のlen分布でプロファイリングされますが、画像は同じままです。)UNI[50,100]

結論: 驚くべきことに、プロファイリングによると、セル実装はあらゆる面でマトリックス実装に勝っています。

于 2012-11-19T22:02:02.983 に答える
1

グラフィック表現から、規則的なパターンを持たない2xN_Rows 構造が必要であることがわかります(実際、そこには一種の確率論があります)。そのため、そのような不規則性をサポートする方法でデータを保存する必要があります。したがって、他の人が言うように、s は自然な解決策です。cell

私が見る限り、行列に挿入する必要がある要素は、確率論的ではありますが、互いに独立しているため、効果的にベクトル化できます。

2互いに独立した確率的寄与があります。

  1. 構造体の最初の列の要素の量はランダムです。

  2. 構造内の要素はランダムです。

貢献を別々に考えてみましょう:

  1. N_Rows可変数の要素を持つ があります。N_El最悪の場合 (つまりN_El、行ごとのエントリ量の上限) があるとしましょう。行ごとの要素数を生成しましょう

     elem_N = randi(`N_El` , [N_Rows 1]);
    
  2. に従って分割された後、行間で分散される正確sum(elem_N)な乱数を生成する必要があります (ポイント 2 の場合) elem_N

これが私が提案する最終的なコードです

N_ROW = 20;
N_EL = 10;    
MAX_int = 20; %maximum random integer in each row

elem_N = randi(N_EL,[N_ROW , 1]);         % elements per line stochasticity
elements = randi(MAX_int, [1 sum(elem)]); % elements value stochasticity

     %cutoff points of the vector "elements" among the rows of the structure
cutoffs = mat2cell(...
     [[1 ; cumsum(elem_N(1:end-1))] cumsum(elem_)]... 
     ,ones(N_ROW,1),[2]);



    %result:
res = [cellfun(@(idx) elements( idx(1):idx(2) ) , cutoffs , 'UniformOutput', false ) ,...
     num2cell( randi(MAX_int,[1 N_ROW])')];

結果

 res = 

[1x9  double]    [20]
[1x3  double]    [12]
[1x5  double]    [ 7]
[1x8  double]    [20]
[1x11 double]    [18]
[1x7  double]    [ 4]
[1x11 double]    [ 1]
[1x4  double]    [15]
[1x5  double]    [18]

どこ

  res{1,1}

ans =

    15    13     2     3    20    10     1     2     3


res{2,1}

 ans =

 3    18    10

等々...

于 2012-11-20T13:40:51.570 に答える