如何遍历3D矩阵中的每个值?

时间:2019-03-28 13:25:58

标签: matlab

我有一个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个像素历史向量结束,现在我以1结尾,这是因为val被写在循环中。我知道不建议在循环中创建变量,那么最好的选择是什么?我应该考虑将输出存储为结构吗?我一直在盯着它看,而我却使一切变得过于复杂。

2 个答案:

答案 0 :(得分:2)

根据您要执行的操作,无需将它们存储在单独的向量中。您可以像这样获得这些像素历史记录向量之一,

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

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

要使时间维度成为第一个矩阵维度,还可以permute矩阵,

permute(my_matrix, [3 2 1]);

这将交换3维和1维,从而使1维时间变长。

答案 1 :(得分:2)

根据您喜欢的结构,还可以使用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)。