在我看来,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
那么,这只是一个临时的解释,我不会测试所有可能的情况。规则是什么?
答案 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()
仍为1x2x1x1x1x2
,1x2x1x1x1x2
也变为1x2x1x1x1x2x1x1
。您可以强制squeeze()
强制淘汰所有单例尺寸;不过,您总是会至少留下一个2D矩阵(即使它只是一个1x2x1x1x1x2
标量)。
正如Cris Lunego所说,
但是,请尝试以下操作:
1x1
实际上,每个数组的末尾都有无数个单例维度!
因此,从技术上讲,每个数组都具有无限数量的维,最后一个都为空,并且MATLAB默认情况下不会显示它们,但是它们是可索引的:
E = zeros(2,3); size(E,3)!