【问题标题】:Logical indexing using a vector使用向量的逻辑索引
【发布时间】:2014-02-23 08:10:58
【问题描述】:

我有向量A = [2 3 1] 和矩阵

B = [0 1 2;
     3 4 5;
     6 7 8];

我希望能够使用 A 中的元素作为逻辑索引器(开始和结束值)对 B 中的值求和。更具体地说,我希望我的代码执行这些操作:

sum(B(1:1,1),sum(B(1:2,2),sum(B(1:3,3))为得到最终向量C,这样

C = [3 12 2]

我有大量数据,所以我想避免使用 for 循环,因为它们似乎会大大减慢代码速度。

提前致谢,

【问题讨论】:

  • 您是如何获得C 的这些值的?
  • @horchler:我的回答很合适,我想这就是 OP 所追求的。我认为你的答案(整体上)比我的好,所以如果你更新你的,我会删除它=)(假设我是对的)
  • @RobertP.:不客气,如果你愿意的话。是不是 OP 颠倒了这两个指数?我只是想从sum(B(1:2,2)) 中取出3
  • @horchler:我想应该是[sum(B(1:2,1), sum(B(1:3,2), sum(B(1:1,3))]。 (列号的增量为 1,而行由 A 索引。对吗?(另外,我注意到 I 在我的答案中颠倒了索引。哎呀...更新了)无论如何:+1 给你,很好的答案!
  • 非常感谢大家提供的信息!与我之前编写的“代码”相比,使用您的提示能够显着减少计算时间!

标签: matlab indexing sum


【解决方案1】:

首先,更正。 A 不能直接用于logical indexing,因为它不是逻辑(布尔)值的向量。您所指的是linear indexing。这是从 1 到元素数量的正常索引值对数组进行索引的地方,就好像它是一个向量一样。

如果A 实际上是1:size(B,1),这是一种解决问题的方法:

B = [0 1 2;3 4 5;6 7 8];
C = sum(triu(B),1)

对于更一般的情况,如果您正确预分配,for 循环可能会非常快。但是你也可以使用arrayfun,这只是一个伪装的for循环(在很多情况下甚至更慢):

A = [2 3 1];
B = [0 1 2;3 4 5;6 7 8];
C = arrayfun(@(x)sum(B(1:x,x)),A)

这些都没有使用线性索引,因为您的A 值描述了如何索引B 的行和列。可以使用sub2ind 轻松转换为线性索引,但这在使用中可能很麻烦,例如:

A = [2 3 1];
B = [0 1 2;3 4 5;6 7 8];
C = arrayfun(@(x)sum(B(sub2ind(size(B),1:x,x+zeros(1,x)))),A)

【讨论】:

  • 非常感谢您的快速回复。我没有提到 A 中的值不一定会增长。例如,A 可以是 [3 1 2] 或 [2 3 1]。
  • @user3254790:那你的例子是不是错了?您的输出似乎是A = [1 2 3],而不是您用作输入的[2 3 1]。你能更新一下吗(如果我没记错的话)?
  • 是的,很抱歉。
【解决方案2】:

我想这就是你所追求的:

t = arrayfun(@(n)sum(B(1:A(n),n),1),1:numel(A))
t =
    11    15     6

输入:

A =
     2     3     1
B =
     8     1     6
     3     5     7
     4     9     2

我假设您希望列号增加,而行号可能会有所不同。

【讨论】:

    【解决方案3】:

    使用bsxfun 为要求和的值创建掩码的替代答案:

    C = sum(B.*bsxfun(@le, (1:size(B,1)), A(:)).');
    

    【讨论】:

      【解决方案4】:
        C=cumsum(B); 
        C=C( sub2ind(size(B),A,1:size(B,1))  ),
      

      【讨论】:

        猜你喜欢
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 2016-07-20
        相关资源
        最近更新 更多