Arrays Matlab中的三维阵列生长

Arrays Matlab中的三维阵列生长,arrays,matlab,matrix-indexing,Arrays,Matlab,Matrix Indexing,有没有一种方法可以在Matlab中使用循环中的end索引在三维中生长3D数组 在2D中,它可以像 a = []; for x = y a(end + 1, :) = f(x); end 但在3D中,同样的事情不会起作用,因为a(1,1,end)将尝试索引a(1,1,1)第一次迭代(而不是人们可能期望的a(1,1,0))。所以我做不到 im = []; for x = y im(:, :, end + 1) = g(x); end 第三维度中a的end处理方式似乎与前两个维度稍有不

有没有一种方法可以在Matlab中使用循环中的
end
索引在三维中生长3D数组

在2D中,它可以像

a = [];
for x = y
   a(end + 1, :) = f(x);
end
但在3D中,同样的事情不会起作用,因为
a(1,1,end)
将尝试索引
a(1,1,1)
第一次迭代(而不是人们可能期望的
a(1,1,0)
)。所以我做不到

im = [];
for x = y
   im(:, :, end + 1) = g(x);
end
第三维度中
a
end
处理方式似乎与前两个维度稍有不同:

>> a = [];
>> a(end,end,end) = 1
Attempted to access a(0,0,1); index must be a positive integer or logical.
我是否遗漏了
end
索引在这里的工作原理

你问的是。。。 如果您知道g(x)的大小,请将
im
初始化为空的三维阵列:

im = zeros(n, m, 0);   %instead of im = [];
我认为你的代码现在应该可以工作了

更好的方法。。。 另一个注意事项是,每次迭代调整数组的大小都很昂贵!如果阵列很小,这并不重要,但是对于大型矩阵,性能会受到很大影响

我将初始化为:

im = zeros(n, m, length(y));
然后进行适当的索引。例如:

i = 1;
for x = y
   im(:, :, i) = g(x);
   i = i + 1;
end

这样,您就不会在每次调整矩阵大小时分配新内存并复制整个矩阵
im

关于初始化的好主意!如果事实上,即使不知道g(x)的大小,它似乎也能工作,那么只做im=0(0,0,0)就可以了。