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