【问题标题】:How to crop matrix of any number of dimensions in Matlab?如何在 Matlab 中裁剪任意维数的矩阵?
【发布时间】:2016-02-10 00:52:24
【问题描述】:

假设我有 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)=[];

【问题讨论】:

  • this Q&A 稍作修改即可使用
  • 为了确保我理解正确 - 问题是您事先不知道索引表达式中需要多少 ,:...?另外我假设您的意思是“任何给定数量的维度> = 2”......?
  • @Dev-iL 是的,就是这样

标签: matlab multidimensional-array crop


【解决方案1】:

可以使用您使用的第二种索引形式和 reshape 函数生成一般维数为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

【讨论】:

  • 对此进行修改可能会起作用...OP 不知道“Asize”,因此需要使用 ndims(或检查 size(A) 的长度)并采取相应措施。
  • 啊,谢谢你的提示。现在即使不知道Asize,它也应该可以工作。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    听起来你只是想使用 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 会返回一个值,其中未索引的维数会折叠到一个数组中(类似于您得到的

    A1 = A(:);
    

    【讨论】:

    • 你的意思是elseif而不是else if
    • 哈哈...好吧,当您经常在 MATLAB、Python 和 Java 之间切换时,就会发生这种情况。适当记录和更正。
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多