我想更好地理解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中那样重塑?
答案 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)
的数组?不好主意!