【问题标题】:Grow 3D array in Matlab在 Matlab 中增长 3D 数组
【发布时间】:2015-12-08 16:35:01
【问题描述】:

有没有办法在 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

似乎第三维中的aend 的处理方式与前两个不同:

>> a = [];
>> a(end,end,end) = 1
Attempted to access a(0,0,1); index must be a positive integer or logical.

我是否遗漏了一些关于 end 索引如何在这里工作的内容?

【问题讨论】:

    标签: arrays matlab matrix-indexing


    【解决方案1】:

    你在问什么...

    如果你知道 g(x) 的大小,将 im 初始化为一个空的 3d 数组:

    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 = zeros(0,0,0) 就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多