如何在 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 将隐式假设所有剩余维度的单一维度,也为维度较少的矩阵返回预期结果。
假设我有 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 将隐式假设所有剩余维度的单一维度,也为维度较少的矩阵返回预期结果。