如何在 Matlab 中裁剪任意维数的矩阵?

How to crop matrix of any number of dimensions in Matlab?

假设我有 4D 矩阵:

>> A=1:(3*4*5*6);
>> A=reshape(A,3,4,5,6);

现在我想切割给定数量的行和列(或已知尺寸的任何给定块)。

如果我知道它是 4D 我会写:

>> A1=A(1:2,1:3,:,:);

但是如何针对任意给定的维数进行通用写入呢?

下面给出了不同的东西:

>> A2=A(1:2,1:3,:);

而下面给出错误:

>> A2=A;
>> A2(3:3,4:4)=[];

使用您使用的第二种索引形式和重塑函数,可以生成一般维数为 A 的代码。 这里有一个例子:

Asize = [3,4,2,6,4]; %Initialization of A, not seen by the rest of the code
A = rand(Asize);

%% This part of the code can operate for any matrix A
I = 1:2;
J = 3:4;
A1 = A(I,J,:);
NewSize = size(A);
NewSize(1) = length(I);
NewSize(2) = length(J);
A2 = reshape(A1,NewSize);

A2 将是您的裁剪矩阵。它适用于您选择的任何 Asize

听起来你只想使用 ndims。

num_dimensions = ndims(A)

if (num_dimensions == 3)
    A1 = A(1:2, 1:3, :);
elseif (num_dimensions == 4)
    A1 = A(1:2, 1:3, :, :);
end

如果可能的矩阵维数范围很小,这种 if-else 块会使其变得简单。看起来你想要一些方法来动态创建索引元组(例如 (1:2,:,:,:) ),我不知道是否有办法做到这一点。您必须将正确的维数与索引相匹配...如果您索引的维数少于矩阵的维数,matlab returns 一个具有未索引维数的值折叠成一个数组(类似于您得到的

A1 = A(:);

我推荐 Luis Mendo 针对一般情况建议的解决方案,但当您知道维度的上限时,也有一个非常简单的解决方案。假设您最多有 6 个维度。对所有矩阵使用 6 维索引:

A1=A(1:2,1:3,:,:,:,:);

Matlab 将隐式假设所有剩余维度的单一维度,也为维度较少的矩阵返回预期结果。