使用向量进行逻辑索引

时间:2014-01-30 20:03:25

标签: matlab indexing sum

我有矢量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循环,因为它们似乎会大大减慢代码速度。

提前致谢,

4 个答案:

答案 0 :(得分:2)

首先,纠正。 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)

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我认为这就是你所追求的:

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 :(得分:1)

  C=cumsum(B); 
  C=C( sub2ind(size(B),A,1:size(B,1))  ),