Matlab 使用向量的逻辑索引
我有向量A=[2 3 1]和矩阵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不能直接用于,因为它不是逻辑(布尔)
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为你,回答很好!非常感谢所有信息员!与上一篇文章相比,使用你的提示可以显著减少计算时间”代码“我写的!