4

所以我已经找到了很多关于这个的问题和答案SO,我认为我的方法应该可行,因为它不是很复杂。但是,我已经为我的时间维度尝试了每个位置,对我来说,现在重塑和保持一个维度相同是行不通的:

我有一个 400x400x20x24 数组,其中 400x400 是一个图像,24 是 20 次的图像数量。我必须对每个体素进行操作,为了更快,我想将我的数组重塑为一个二维矩阵,其中一维是 20,并且只有时间值。我知道(或认为我知道)如何做到这一点,并在重塑之前尝试了所有可能的维度顺序,但没有一个结果是我的旧数据:

array1 = rand(400,400,20,24);

这就是一个体素随时间变化的样子

plot([1:20], squeeze(array1(200,200,:,12)))

原来的

twoD1 = reshape(array1, [], 20);
size(twoD)
    ans = 3840000 20

到目前为止一切顺利,直到我绘制一个像素及其时间值

plot([1:20], squeeze(twoD1(962400,:)))

重塑1

嗯等一下,尺寸 20 的尺寸不再是尺寸 20 的原始尺寸,也许重新排列我的原始尺寸会影响这一点。

array2 = permute(array1, [3 1 2 4]);
array3 = permute(array1, [1 3 2 4]);
array4 = permute(array1, [1 2 4 3]);

twoD2 = reshape(array2, [], 20);
twoD3 = reshape(array3, [], 20);
twoD4 = reshape(array4, [], 20);

plot([1:20], squeeze(twoD2(962400,:)))
plot([1:20], squeeze(twoD3(962400,:)))
plot([1:20], squeeze(twoD4(962400,:)))

重塑2

重塑3

重塑4

我不明白为什么它不起作用。我看过这些问题,但它们似乎表明我做对了,对吧?

在matlab中重塑矩阵

如何在 MATLAB 中调整矩阵的大小?

将 3 维数组重塑为 2 维

将多维向量更改为二维向量matlab

MATLAB重塑矩阵将索引转换为行索引

如何为这个例子重塑 matlab 矩阵?

将矩阵从 3d 重塑为 2d 保持行

将 3d 矩阵重塑为 2d 矩阵

当然我也读过:

http://www.mathworks.nl/help/matlab/ref/reshape.html

http://www.mathworks.nl/help/matlab/ref/permute.html

一切都无济于事。有人请帮助我吗?谢谢!

4

1 回答 1

4

要注意的第一个问题是,twoD1 = reshape(array1, [], 20);它不会做你想做的事情,因为array1is 400x400x20x24。如果最后一个维度是,reshape则唯一按预期工作20

twoD = reshape(permute(array1,[1 2 4 3]),[],20);

这为您提供了所有像素,20 个时间点的所有 24 个图像。如果要为图像 12 绘制像素 (200,200) 的 20 个时间点,请执行以下操作:

[numRows,numCols,numTimes,numSlices] = size(array1);
imgInd = 12; pixRow = 200; pixCol = 200;
ind = sub2ind([numRows numCols numSlices],pixRow,pixCol,imgInd)
% ind = pixRow + numRows*(pixCol-1) + numRows*numCols*(imgInd-1)
plot(1:size(twoD,2), twoD(ind,:))

编辑:对不起,我ind首先计算错了。现在工作。

于 2013-10-10T20:03:27.177 回答