Matlab 使用向量的逻辑索引

Matlab 使用向量的逻辑索引,matlab,indexing,sum,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循环,因为它们似乎会大大降低代码的速度 提前感谢,首先是一个更正。a不能直接用于,因为它不是逻辑(布尔)

我有向量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循环,因为它们似乎会大大降低代码的速度


提前感谢,

首先是一个更正。
a
不能直接用于,因为它不是逻辑(布尔)值的向量。您所指的是所谓的。这里,1到元素数的正常索引值将数组作为向量进行索引

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

对于更一般的情况,
For
循环可能非常快,只要您正确地预先分配。但您也可以使用
arrayfun
,它只是一个伪装的
For
循环(在许多情况下甚至更慢):

所有这些都不使用线性索引,因为
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
不能直接用于,因为它不是逻辑(布尔)值的向量。您所指的是所谓的。这就是1到元素数的正常索引值对数组进行索引,就像它是一个向量一样

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

对于更一般的情况,
For
循环可能非常快,只要您正确地预先分配。但您也可以使用
arrayfun
,它只是一个伪装的
For
循环(在许多情况下甚至更慢):

所有这些都不使用线性索引,因为
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)

我想这就是你想要的:

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

我假设您希望列数增加,而行数可能会变化。

我想这就是您想要的:

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

我假设您希望列数增加,而行数可能会变化。

用于为要求和的值创建掩码的备选答案:

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

用于为要求和的值创建掩码的备选答案:

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

非常感谢您的快速响应。我没有提到A中的值不一定在增长。例如,A可能是[3 1 2]或[2 3 1]。@user3254790:那么您的示例是否有误?您的输出似乎是用于输入的
A=[1 2 3]
,而不是
[2 3 1]
。请更新(如果我没有错的话)是的,很抱歉。非常感谢您的快速响应。我没有提到A中的值不一定在增长。例如,A可能是[3 1 2]或[2 3 1]。@user3254790:那么您的示例没有错吗?您的输出似乎是用于输入的
A=[1 2 3]
,而不是
[2 3 1]
。请更新(如果我没有错的话)?是的,很抱歉。你是如何得到
C
的那些值的?@horchler:我的答案很合适,我想这是OP想要的。我认为你的答案(整体上)比我的好,所以如果你更新你的=),我会删除它(假设我是对的)@罗伯特普:不客气,如果你愿意的话。是不是OP把这两个指数颠倒了?我只是想从
sum(B(1:2,2))
@horchler:我想应该是
[sum(B(1:2,1),sum(B(1:3,2),sum(B(1:1,3))
。(列编号的增量为1,而行由
A
索引。这是对的吗?(另外,我注意到我在回答中颠倒了索引。哎呀…更新)无论如何:+1为你,回答很好!非常感谢所有的信息员!与上一篇文章相比,使用你的提示可以显著减少计算时间“代码”是我写的!你是如何得到
C
的那些值的?@horchler:我的答案很合适,我想这是OP想要的。我认为你的答案(整体上)比我的好,所以如果你更新你的=),我会删除它(假设我是对的)@罗伯特普:不客气,如果你愿意的话。是不是OP把这两个指数颠倒了?我只是想从
sum(B(1:2,2))
@horchler:我想应该是
[sum(B(1:2,1),sum(B(1:3,2),sum(B(1:1,3))
。(列编号的增量为1,而行由
A
索引。这是对的吗?(另外,我注意到我在回答中颠倒了索引。哎呀…更新)无论如何:+1为你,回答很好!非常感谢所有信息员!与上一篇文章相比,使用你的提示可以显著减少计算时间”代码“我写的!