【问题标题】:How can I extract a 1 dimentional row from a multidimentional matrix如何从多维矩阵中提取一维行
【发布时间】:2014-06-04 14:36:56
【问题描述】:

我目前有一个 3 维矩阵,我想通过索引(比如matrix(2,1,:))从中提取一行(到第三维)。我最初预计这将是一个一维矩阵,但我得到的是一个 1 x 1 x n 矩阵。通常这不是问题,但我使用的一些函数不喜欢 3D 矩阵。例如看下面复制的问题:

threeDeeMatrix=rand(3,3,3);
oneDeeAttempt=threeDeeMatrix(1,1,:);
norm(oneDeeAttempt)

返回错误信息:

Error using norm
Input must be 2-D.

这是因为 oneDeeAttempt 是

oneDeeAttempt(:,:,1) =

    0.8400


oneDeeAttempt(:,:,2) =

    0.0700


oneDeeAttempt(:,:,3) =

    0.7663

而不是[0.8400 0.0700 0.7663]

如何去除这些额外的尺寸?我能想出的唯一解决方案是使用循环手动复制值,但这似乎有点过分。

【问题讨论】:

    标签: arrays matlab matrix multidimensional-array


    【解决方案1】:

    使用 permute 重新排列矩阵

    解决方案(我在提出这个问题的最后阶段发现)是使用 permute 重新排列维度的顺序(类似于 2D 矩阵的 a=a')。一旦单位维度是最后一个,它们就会从矩阵中剥离出来,变成一维的。

    oneDee=permute(oneDeeAttempt,[3 1 2]) %rearrange so the previous third dimension is now the first
    %the matrix is now 3 by 1 by 1 which becomes 3
    

    使用挤压删除前导单例维度

    正如Luis Mendo 所指出的,squeeze 将非常简单地删除这些领先的单件维度,而不必担心哪些维度是非单件的

    oneDee=squeeze(oneDeeAttempt);
    

    【讨论】:

    • 使用squeeze更简单。它会自动删除所有(标题)单例维度,二维数组除外(行向量不受影响)
    • @LuisMendo 不错!我总是说自我回答的问题仍然有自私的原因:以防其他人有更好的解决方案。如果您希望将其发布为答案,我会接受
    • 明确挤压。这就是它存在的原因
    • 我以前发布过自我回答的问题,如果不是他们的动机,我知道自私。您已花时间发布问题;如果您愿意,请继续并在您的答案中包含squeeze :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多