如果我输入X = rand(2,3)
,那么size(X,1)
和size(X,2)
会产生预期结果。如果我输入ndims (X)
,我会得到预期的两个维度。尺寸()返回1,其中矩阵尺寸不应该存在
但是,size(X, k) == 1
,其中k
是大于3的整数。为什么会发生这种情况?
如果我输入X = rand(2,3)
,那么size(X,1)
和size(X,2)
会产生预期结果。如果我输入ndims (X)
,我会得到预期的两个维度。尺寸()返回1,其中矩阵尺寸不应该存在
但是,size(X, k) == 1
,其中k
是大于3的整数。为什么会发生这种情况?
如果尺寸行为要一致,就必须发生这种情况。我们考虑一个大小为1xn或nx1的向量。当然,方向很重要,否则MATLAB可以简单地告诉你矢量的长度为n。在后一种情况下,有一个尾随的单身维度,所以隐含地存在无限多的尾随单身维度。因此,列向量的大小实际上是nx1x1x1 ...,行向量的大小是1xnx1x1 ...
标量也是如此。如果标量大小为1x1,那么它的大小必须为1x1x1x1x ...
大小必须告诉您一个对象的大小,但它应该停止在哪里?我想如果你是从头开始重新设计MATLAB,你可能会决定不报告任何尾随的单例尺寸。所以一个列向量将被报告为维度n,但是维度为1xn的行向量?说实话,我实际上更喜欢被告知一个列向量具有维度nx1。但那么它必须在逻辑上是维nx1x1x1 ...
无论如何,很久以前,MATLAB不允许你在数组中超过两维索引。更高维的数组在这里至少有20年左右的历史,但仍有许多遗留代码仍然有用。 (我有25年前编写的代码,仍在使用中)。您不想破坏现有代码。
size(X,3)
是在你的情况下,第三维的大小IS 1
。例如尝试X = rand(2, 3, 5, 23, 4,2, 6)
,现在size(X, 3)
应该给5
。
所有2D矩阵之后是真的一样一个三维矩阵,其中该第三维度的大小是1
我想知道的是为什么第三(和第四,和第五......)尺寸应作为尾随单身尺寸存在。为什么不简单地停在这两个维度上,并尝试在第三维上使用大小返回错误消息? – user1205197
@ user1205901,因为如果'size'策略抛出错误**现有代码的** LOT **将停止工作,并且所有地狱都会崩溃! – Shai
*一个二维矩阵真的是相同的一个三维矩阵,其中第三维的大小是1 *仅在疯狂的世界中是正确的,例如,标量与1x1矩阵相同......哦,挂起上,这就是Matlab :-) –
这里是一个三维阵列的可视化。叫它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,...)。
+1为可视化 – Shai
+1由于历史原因,为什么大小应默认回答两个元素,即使对于标量 –