在子矩阵中压缩单例尺寸的背后的规则是什么?

时间:2019-06-23 10:32:43

标签: matlab matrix submatrix

在我看来,MATLAB在最后一个非单维度的右侧压缩了单维度,并限制了矩阵必须至少为二维。

从示例中推断出一条规则会使我感到不舒服,但这似乎行得通。

在2D模式下

E = zeros(2,3);

E(1,:); % 1x3
E(:,1); % 2x1

在3D模式下:

E = zeros(2,3,4);

E(1,:,:); % 1x3x4
E(:,1,:); % 2x1x4
E(:,:,1); % 2x3

E(1,1,:); % 1x1x4
E(:,1,1); % 2x1
E(1,:,1); % 1x3

在4D中:

E = zeros(2,3,4,5);

E(:,:,:,1) % 2x3x4
E(:,:,1,1) % 2x3
E(:,1,1,1) % 2x1

E(1,:,:,:) % 1x3x4x5
E(1,1,:,:) % 1x1x4x5
E(1,1,1,:) % 1x1x1x5

E(:,:,1,:) % 2x3x1x5
E(:,1,:,:) % 2x1x4x5

E(1,:,:,1) % 1x3x4
E(1,:,1,:) % 1x3x1x5
E(:,1,:,1) % 2x1x4

E(1,1,:,1) % 1x1x4
E(1,:,1,1) % 1x3

任何人都可以确认这是否是规则吗?

偶然的问题:此规则是否也适用于诸如diff()之类的函数?好像是这样。

我看到的唯一区别是,您可以得到一个空矩阵,然后即使该维度最大,也不会删除其左侧的单例维度:

E = zeros(2,3,4);

diff(E,1,1) % 1x3x4
diff(E,3,2) % 0x3x4

diff(E,2,2) % 2x1x4
diff(E,3,2) % 2x0x4

diff(E,3,3) % 2x3
diff(E,4,3) % 2x3x0

在4D中

E = zeros(2,3,1,5);
diff(E,3,4) % 2x3x1x2
diff(E,4,4) % 2x3
diff(E,5,4) % 2x3x1x0

那么,这只是一个临时的解释,我不会测试所有可能的情况。规则是什么?

1 个答案:

答案 0 :(得分:4)

任何大于第二个的尾随单例尺寸都会被自动剥离。因此static void ExecuteCommand(string command, string input) { Console.WriteLine("Test if this thing works"); Process pro = new Process(); pro.StartInfo.FileName = command; pro.StartInfo.UseShellExecute = false; pro.StartInfo.RedirectStandardInput = true; pro.StartInfo.RedirectStandardOutput = true; pro.Start(); string result = pro.StandardOutput.ReadToEnd(); Console.WriteLine(result); } 1x2x1一样会自动变成1x2,但是1x2x1x1x1x1x1x1x1x1仍然是2x1。当您在问题中进行索引时,以及在2x1之类的函数将输出以单例尺寸结尾的内容时,都会发生这种情况。

剩下的任何单例尺寸不是。因此diff()仍为1x2x1x1x1x21x2x1x1x1x2也变为1x2x1x1x1x2x1x1。您可以强制squeeze()强制淘汰所有单例尺寸;不过,您总是会至少留下一个2D矩阵(即使它只是一个1x2x1x1x1x2标量)。


正如Cris Lunego所说,

  

但是,请尝试以下操作:1x1实际上,每个数组的末尾都有无数个单例维度!

因此,从技术上讲,每个数组都具有无限数量的维,最后一个都为空,并且MATLAB默认情况下不会显示它们,但是它们是可索引的:

E = zeros(2,3); size(E,3)!