如果我输入X = rand(2,3)
,则size(X,1)
和size(X,2)
会产生预期结果。如果我输入ndims (X)
,我会得到预期的两个维度。
然而,size(X, k) == 1
,其中k
是任何整数> 3.为什么会这样?
答案 0 :(得分:7)
如果大小的行为要保持一致,则必须发生这种情况。我们想到一个大小为1xn或nx1的向量。当然,方向很重要,否则MATLAB可以简单地告诉你向量的长度为n。在后一种情况下,存在一个尾随单例维度,因此隐含地存在无限多个尾随单例维度。所以列向量的大小实际为nx1x1x1 ...,行向量的大小为1xnx1x1 ......
标量也是如此。如果标量大小为1x1,那么它的大小必须是1x1x1x1x ......
大小必须告诉你对象的大小,它应该停在哪里?我想如果你从头开始重新设计MATLAB,你可能决定不报告任何尾随单例维度。因此,列向量将报告为维度n,但行向量的维度为1xn?说实话,我实际上更喜欢被告知列向量具有维度nx1。但它必须在逻辑上具有维度nx1x1x1 ......
无论如何,很久以前MATLAB不允许你在数组中超出两个维度。高维数组已经存在至少20年左右,但仍有许多遗留代码仍然有用。 (我有25年前编写的代码,并且仍在使用中。)您不想破坏现有代码。
答案 1 :(得分:4)
这是三维数组的可视化。称之为x
。每个"切片"通过数组是一个二维矩阵。
您可以看到size(x,1) = 6
和size(x,2) = 6
,以及size(x,3) = 6
。 size
函数计算每边的立方体数量。
现在考虑如果我们让y
成为单个"切片"会发生什么?数组。它在第一个和第二个方向上仍然有六个立方体,所以size(y,1) = 6
和size(y,2) = 6
,但现在每个切片在第三个方向上只有一个立方体 - 所以size(y,3) = 1
。
此图案继续用于更高尺寸(4,5,6,......),但无法在图片中显示这些图案。
答案 2 :(得分:2)
size(X,3)
是第三维的大小,在您的情况下是1
。以X = rand(2, 3, 5, 23, 4,2, 6)
为例,现在size(X, 3)
应该5
。
毕竟2D矩阵实际上是相同的3D矩阵,其中第三维的尺寸是1