matlab - 不固定维度矩阵,一次将值设置为结构的多个字段,避免循环
matlab - unfixed dimension matrix, set value to multiple fields of struct at once, avoid loop
我有 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,我只需要 3rd-dimension 等最多 160 个索引
问题是:
- 因为我实际上必须处理 10 个字段,所以是否可以同时为字段赋值(不是 1 行 1 字段)?
有没有办法避免 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;
但是这里所有的矩阵都填充了最大 3rd-dimension = 5120 所以我希望有人能告诉我如何使用像 arrayfun, bsxfun, cellfun etc.
这样的向量化函数,它可以只适用于 "half-cubic"就像上面的 for 循环。
更新:
感谢 horchler 的视频,当我将结构的矩阵更改为以矩阵作为字段的结构时,矩阵的大尺寸(以字节为单位)的问题似乎得到了解决。即使使用嵌套的 for 循环,这也清除了计时问题。所以我也更新了问题和输入,请看上面。
是的,我认为在这里使用数组结构更适合您。您应该能够使用 zeros
进行分配,就像 mat.p1
、mat.p2
等是常规数组一样。我会使用单个 for
循环做这样的事情(请注意,您没有为 mat.p2
指定任何值):
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);
我有 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,我只需要 3rd-dimension 等最多 160 个索引
问题是:
- 因为我实际上必须处理 10 个字段,所以是否可以同时为字段赋值(不是 1 行 1 字段)?
有没有办法避免 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;
但是这里所有的矩阵都填充了最大 3rd-dimension = 5120 所以我希望有人能告诉我如何使用像
arrayfun, bsxfun, cellfun etc.
这样的向量化函数,它可以只适用于 "half-cubic"就像上面的 for 循环。
更新: 感谢 horchler 的视频,当我将结构的矩阵更改为以矩阵作为字段的结构时,矩阵的大尺寸(以字节为单位)的问题似乎得到了解决。即使使用嵌套的 for 循环,这也清除了计时问题。所以我也更新了问题和输入,请看上面。
是的,我认为在这里使用数组结构更适合您。您应该能够使用 zeros
进行分配,就像 mat.p1
、mat.p2
等是常规数组一样。我会使用单个 for
循环做这样的事情(请注意,您没有为 mat.p2
指定任何值):
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);