理解Matlab多维阵列

理解Matlab多维阵列,matlab,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 一,。是我实际期望的所有操作的行为 我不明白为什么我把不想要的维度保留

我想通过一个简单的问题更好地理解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
一,。是我实际期望的所有操作的行为

我不明白为什么我把不想要的维度保留在2

我是否需要像3中那样重塑。每次我需要一个子数组时?

Matlab只删除单个尾随维度,所以您看到的是正常的

在1中,您从4D数组中删除了一个2D子集,但前两个维度是“行”和“列”

在图2中,“行”和“列”都是单态的,数组的其余部分是第三维和第四维的,因此Matlab保持这种方式


您可以通过挤压(A(1,1,:,:,:)来删除长度为1的维度(维度1和维度2除外,这两个维度有点硬编码到Matlab中)。

您可以使用
重塑
,或者在这种情况下简单地使用

MATLAB始终删除尾随的单个维度(超过前两个):

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

另一方面,保留了其他单态维度<代码>挤压删除它们

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

>> a(1:x,1:y,1:z)

只要
x
y
大于一,就会返回大小为
(x,y,z)
的数组。使
x=1
,现在它是一个大小为
(y,z)
?坏主意

额外信息:从技术上讲,尺寸是存在的<代码>尺寸(a,100)
>> a = zeros(4,4);
>> a(2,2,1,1); % is OK
>> size(a,100)
ans = 
   1
>> a(1:x,1:y,1:z)