1

フィールドとして行列を持つ 2 つの (あまり小さくない) 3 次元構造体があります。

sz1 = 200;
sz2 = 9;
sz3 = [20, 40, 80, 160, 320, 640, 1280, 2560, 5120]
% actually the structs have 12 fields, each has size 200x9x5120
mat.p1(sz1, sz2, sz3(sz2)) = uint8(0);
mat.p2(sz1, sz2, sz3(sz2)) = uint8(0);
mat.p3(sz1, sz2, sz3(sz2)) = 0;
mat.p4(sz1, sz2, sz3(sz2)) = 0;
old_mat.p1(sz1, sz2, sz3(sz2)) = uint8(0);
old_mat.p2(sz1, sz2, sz3(sz2)) = uint8(0);
old_mat.p3(sz1, sz2, sz3(sz2)) = 0;
old_mat.p4(sz1, sz2, sz3(sz2)) = 0;

そしてreset、次のように、両方のマトリックスの 4 つのフィールドのうち 3 つ (実際には 12 のうち 10) のフィールドに値を再割り当てする関数を作成する必要があります。

for i = 1:sz1
  for j = 1:sz2
    for k = 1:sz3(j)
      mat.p1(i,j,k) = uint8(255);
      mat.p3(i,j,k) = -1;
      mat.p4(i,j,k) = 0.01;
      old_mat.p1(i,j,k) = uint8(255);
      old_mat.p3(i,j,k) = -1;
      old_mat.p4(i,j,k) = 0.01;
    end
  end
end

reset実際に行列に必要なものは関数と同じであることに注意してください。つまり、2 次元が 9 の場合、3 次元の 5120 番目のインデックスのみが必要です。2 次元 = 4 の場合、最大 160 のインデックスしか必要ありません三次元など

質問は次のとおりです。

  1. 実際には10個のフィールドを処理する必要があるため、フィールドに同時に(1行1フィールドではなく)値を割り当てる方法はありますか?
  2. forループを回避する方法はありますか? 私はこのように試しました:

    mat.p1(:) = uint8(255);
    mat.p3(:) = -1;
    mat.p4(:) = 0.01;
    old_mat.p1(:) = uint8(255);
    old_mat.p3(:) = -1;
    old_mat.p4(:) = 0.01;
    

    arrayfun, bsxfun, cellfun etc.しかし、ここではすべての行列が最大 3 次元 = 5120 で満たされているので、上記の for ループのような「半立方体」だけに適用できる のようなベクトル化関数の使用方法を誰かが教えてくれると期待しています。

更新: ビデオの horchler に感謝します。構造体のマトリックスをフィールドとしてマトリックスを持つ構造体に変更すると、マトリックスの大きなサイズ (バイト単位) の問題が解決されるようです。これにより、ネストされた for ループでもタイミングの問題が解消されます。そのため、質問と入力も更新しました。上記を参照してください。

4

1 に答える 1

1

はい、ここでは配列の構造を使用する方がうまくいくと思います。、などが通常の配列であるzerosかのように使用して割り当てることができるはずです。単一のループを使用して、次のようなことを行います ( の値を指定しなかったことに注意してください)。mat.p1mat.p2mat.p2for

sz1 = 200;
sz2 = 9;
sz3 = [20, 40, 80, 160, 320, 640, 1280, 2560, 5120];
% Be careful with this form of pre-allocation if your sz arrays change
% Clear your struct or make sure to use the code in a function 
mat.p1(sz1,sz2,sz3(sz2)) = uint8(0);
mat.p3(sz1,sz2,sz3(sz2)) = 0;
mat.p4(sz1,sz2,sz3(sz2)) = 0;
for i = 1:sz2
    mat.p1(:,i,1:sz3(i)) = uint8(255);
    mat.p3(:,i,1:sz3(i)) = -1;
    mat.p4(:,i,1:sz3(i)) = 0.01;
end
old_mat.p1 = mat.p1;
old_mat.p3 = mat.p3;
old_mat.p4 = mat.p4;

または、次のようなこともできます。

sz1 = 200;
sz2 = 9;
sz3 = [20, 40, 80, 160, 320, 640, 1280, 2560, 5120];
mat = struct('p1',zeros(sz1,sz2,sz3(sz2),'uint8'),...
             'p3',zeros(sz1,sz2,sz3(sz2)),...
             'p4',zeros(sz1,sz2,sz3(sz2)));
for i = 1:sz2
    mat.p1(:,i,1:sz3(i)) = uint8(255);
    mat.p3(:,i,1:sz3(i)) = -1;
    mat.p4(:,i,1:sz3(i)) = 0.01;
end
old_mat = struct('p1',mat.p1,'p3',mat.p3,'p4',mat.p4);
于 2015-05-11T00:38:32.727 に答える