【问题标题】:How to select vector elements from each row of a 3D matrix in MATLAB?如何从 MATLAB 中的 3D 矩阵的每一行中选择向量元素?
【发布时间】:2015-10-23 18:37:30
【问题描述】:

我有一个 3D 矩阵,例如 1000×4×20 矩阵 A,我想根据 1000×1 索引从 A 的每一行中选择一个 1×20 向量向量 B。该索引向量包括从 1 到 4 的数字。 另外,我不想使用 for 循环。 我应该怎么做(有和/或没有“sub2ind”)?

谢谢。

【问题讨论】:

    标签: arrays matlab multidimensional-array indexing


    【解决方案1】:

    我不确定这是最优雅的方式,但它可以完成工作:

    [r,c,~]=size(A);
    Q=reshape(A,r*c,[]);
    P=sub2ind([r,c],[1:r]',B);
    result=Q(P,:);
    

    这会将每个 1x1x20 向量放入 1000x20 结果矩阵的适当行中。如果需要,您可以合并最后两行。

    这是样本运行的前 20 行,前面附加了向量 B,以显示我们应该采用哪一列。 A 的构造应该很明显(第一个数字是列号,接下来的 3 是行号 - 1。1x1x20 向量的所有元素都是相同的。)

      B       result
      2       2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000   2000
      1       1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001   1001
      4       4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002   4002
      4       4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003   4003
      3       3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004   3004
      4       4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005   4005
      3       3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006   3006
      1       1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007   1007
      3       3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008   3008
      4       4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009   4009
      2       2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010   2010
      4       4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011   4011
      3       3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012   3012
      2       2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013   2013
      4       4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014   4014
      4       4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015   4015
      1       1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016   1016
      2       2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017   2017
      4       4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018   4018
      3       3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019   3019
    

    【讨论】:

    • @beaker,谢谢,这正是我想要的。但是我需要此代码的整体代码突然需要很长时间才能执行。我将发布另一个问题来解决这个问题。
    【解决方案2】:

    这是使用bsxfun的另一种方式:

    [r, c, t] = size(A);
    result = A(bsxfun(@plus, (1:r).'+r*(B-1), (0:t-1)*r*c));
    

    【讨论】:

      【解决方案3】:

      假设向量被称为A。你可以像这样索引它:

      A(1:1000,B,:)
      

      其中 index1 的取值范围为 1 到 1000,index2 的取值范围为 1 到 4。 冒号选择该索引级别的所有内容。

      【讨论】:

      • 我在 MATLAB 中问这个问题(在标题和标签中)。
      • 抱歉,我认为那是 Mathematica 和 pandas 索引。已编辑。
      • 你能添加一个更详细的B描述吗?它是两个索引,一个用于 A 的第一个维度,一个用于 A 的第二个维度?
      • B 是一个包含 1000 个元素的向量,其值从 1 到 4 不等。因此,对于每一行,我需要从该行的四个 20×1 向量中提取一个。
      • A(1:1000,B,:) 给你一个1000x1000x20 矩阵。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 2018-12-13
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多