理解Matlab多维数组

时间:2018-03-27 13:46:25

标签: matlab

我想更好地理解Matlab多维度数组和:运算符的快速问题

所以我运行了这个例子

A = zeros(2,3,4,5);
size(A)
% ans = 2 3 4 5

%% 1.
size(A(:,:,1,1))
% ans = 2 3

%% 2.
size(A(1,1,:,:))
% ans = 1 1 4 5

%% 3.
size(reshape(A(1,1,:,:), 4, 5))
% ans = 4 5

1。是我实际预期的所有操作的行为。

我不明白为什么我会在 2中保留不需要的维度。

每次我需要一个子阵列时,是否需要像 3中那样重塑

2 个答案:

答案 0 :(得分:4)

Matlab只删除单身尾随尺寸,所以你看到的是正常的。

1 中,您从4D数组中删除了2D子集,但前两个维度是“row”和“column”。

2 中,“row”和“column”都是单例,而数组的其余部分是第三维和第四维,所以Matlab保持这种方式。

而不是reshape,您可以squeeze(A(1,1,:,:))删除长度为1的维度(维度1和2除外,它们都是硬编码到Matlab中)。

答案 1 :(得分:3)

在这种情况下,您可以使用reshape或简称squeeze

MATLAB总是删除尾随单例维度(超过前两个):

>> size(zeros(4,4,4,1,1))
ans =
   4 4 4

但它也会在需要时添加它们(或者正如Ander在评论中指出的那样,它们总是隐含在那里):

>> a = zeros(4,4);
>> a(2,2,1,1); % is OK
>> size(a,100)
ans = 
   1

另一方面,保留其他单例尺寸。 squeeze删除它们。

对于您的特定应用程序,删除单例维度是有意义的,但如果这是默认行为,则其他应用程序会出现问题。想象一下,代码提取某个子卷,并根据选择的行数或列数来改变数据的方向。例如:

>> a(1:x,1:y,1:z)
只要(x,y,z)x大于1,

就会返回一个大小为y的数组。制作x=1,现在它是一个大小为(y,z)的数组?不好主意!