【问题标题】:How to loop through each value in a 3D matrix?如何遍历 3D 矩阵中的每个值?
【发布时间】:2019-03-28 13:25:57
【问题描述】:

我有一个 10x10x40 的矩阵,它通过时间存储图像的信息,其中行和列表示特定点的光谱值,第三维是时间。换句话说,40 个时间点的 10x10 图像。我想遍历每一行、每一列并查看像素历史记录 (1,1,:), (1,2,:)....(10,10,:)。

这是我现在正在做的事情:

val = [];
for i = 1:10;
  for j = 1:10;
    for k = 1:length(timevector)
      val(k) = my_matrix(i,j,k); 
    end
  end
end

由于我想及时遍历每个像素然后保存该数据,存储新值/时间向量的最佳方法是什么?我想以 100 个像素历史向量结束,现在我以一个结束,这是因为 val 在循环中被写入。我知道不建议在循环中创建变量,那么最好的选择是什么?我应该考虑将输出存储为结构吗?我一直盯着这个,我把一切都复杂化了。

【问题讨论】:

  • 目前还不清楚您的预期输出是什么。你想要一个 100 元素的向量输出吗? 10x10 2D“层”应该如何对应一维数组?您是否希望最终得到 100 个向量,每个 1x40 大小的向量仍然包含所有时间数据?这与您的原始矩阵有何不同?
  • 我最终要过滤每个向量,我可以在循环中创建过滤矩阵 - 我只是不知道如何制作/执行循环
  • 您还可以根据过滤器功能以矢量化形式进行过滤。例如。 filtfilt 沿第一个维度进行操作,具有多个元素,因此通过对矩阵进行置换、过滤和反置换,与循环相比,您将获得巨大的性能提升。
  • 这听起来像X-Y problem。陈述你想要达到的目标,而不仅仅是如何解决问题的一小部分。最好的输出格式取决于你想要做什么,正如@rinkert 所说,你可能根本不需要这一步
  • 请添加一个最小示例和所需的输出。

标签: matlab


【解决方案1】:

根据自己喜欢的结构,也可以使用matlab的函数reshapenum2cell得到如下形式的输出:

备选方案 1:

A = reshape(A,[],10);

这将返回一个矩阵 (100x40),其中每一行都是一个像素的历史记录。

备选方案 2:

A = num2cell( reshape(A,[],40), 2)

这将返回一个元胞数组 (100x1),其中每个元胞都包含一个向量 (40x1),其中包含每个像素的历史记录。

备选方案 3:

A = squeeze( num2cell( permute(A, [3,1,2]), 1) );

这将返回一个元胞数组 (10x10),其中每个元胞都包含一个向量 (40x1),其中包含每个像素的历史记录。

【讨论】:

  • 欢迎您!检查你的其他问题,我看到你没有接受任何答案。如果您直到现在对提供的答案不满意,那完全可以。但是,如果您只是没有注意到您是如何做到的,您可以通过单击它旁边的复选标记来接受答案,并且它不会再在板上显示为未回答。 (当然,只有当它有效并且很好地回答了你的问题时才接受它。)
【解决方案2】:

根据您想用它做什么,您不需要将它们存储在单独的向量中。您可以像这样获取这些像素历史向量之一,

pixel_history = squeeze(my_matrix(1,1,:));

squeeze 将从切片中移除单例维度,并将其变为 40×1 向量,而不是 1×1×40 矩阵。

要将时间维度设为矩阵的第一个维度,也可以permute矩阵,

permute(my_matrix, [3 2 1]);

这将交换第 3 维和第 1 维,使第 1 维成为时间。

【讨论】:

  • 感谢您的建议。因此,循环遍历矩阵中的每个点,对于 i=1:10 for j = 1:10;像素历史=挤压(我的矩阵(i,j,:));结束结束?我仍然只得到一个向量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多