在matlab中正确地重塑多维N-D阵列而不会扭曲数据

时间:2013-10-10 19:46:39

标签: arrays matlab multidimensional-array permutation reshape

所以我已经在SO找到了许多的问题和答案,我认为我的方法应该有效,因为它不是很复杂。然而,我已经尝试了每个位置,因为我的时间维度是可能的,对我而言,现在重塑并保持一个维度不相同:

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

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

这是一个体素过时的样子

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

original

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

到目前为止一直很好,直到我绘制一个像素及其时间值

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

reshape1

嗯等一下,尺寸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,:)))

reshape2

reshape3

reshape4

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

Reshaping a matrix in matlab

How do I resize a matrix in MATLAB?

Reshaping a 3 dimensional array to 2 dimensions

Change a multidimensional vector to two dimensional vector matlab

MATLAB reshape matrix converting indices to row index

How to reshape matlab matrices for this example?

Reshape matrix from 3d to 2d keeping rows

Reshape 3d matrix to 2d matrix

当然我也读过:

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

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

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

1 个答案:

答案 0 :(得分:3)

需要注意的第一个问题是twoD1 = reshape(array1, [], 20);无效,因为array1400x400x20x24。如果最后一个维度为reshape,则20仅按预期工作:

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

它为您提供所有像素,所有24个图像的20个时间点。如果要为图像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。立即行动。