我有一个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被写在循环中。我知道不建议在循环中创建变量,那么最好的选择是什么?我应该考虑将输出存储为结构吗?我一直在盯着它看,而我却使一切变得过于复杂。
答案 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的函数reshape
和num2cell
以以下形式获取输出:
替代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)。