Matlab 递增B的A(i)行中的列i

Matlab 递增B的A(i)行中的列i,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,有没有更好的方法来实现这个循环 for i = find(A > 42) B(A(i), i) = B(A(i), i) + 1; end A是一个整数数组B是一个max(a)×长度(a)矩阵 例如: A = reshape(magic(3), 1, 9); %# 8 3 4 1 5 9 6 7 2 B = zeros(max(A), length(A)); for i = find(A > 3) B(A(i), i) = B(A(i), i) + 1; end

有没有更好的方法来实现这个循环

for i = find(A > 42)
    B(A(i), i) = B(A(i), i) + 1;
end
A
是一个整数数组
B
是一个
max(a)
×
长度(a)
矩阵

例如:

A = reshape(magic(3), 1, 9); %# 8 3 4 1 5 9 6 7 2
B = zeros(max(A), length(A));
for i = find(A > 3)
    B(A(i), i) = B(A(i), i) + 1;
end

B = [
    0     0     0     0     0     0     0     0     0
    0     0     0     0     0     0     0     0     0
    0     0     0     0     0     0     0     0     0
    0     0     1     0     0     0     0     0     0
    0     0     0     0     1     0     0     0     0
    0     0     0     0     0     0     1     0     0
    0     0     0     0     0     0     0     1     0
    1     0     0     0     0     0     0     0     0
    0     0     0     0     0     1     0     0     0
]

对于这种情况,我建议使用线性索引。使用将行/列子索引转换为线性索引


如果需要,您可以将其组合成一行,为了清晰起见,我将其保留为多行。

我建议对这种情况使用线性索引。使用将行/列子索引转换为线性索引

B = zeros(max(A), length(A)); 
inds = find(A > thresh);
B(sub2ind(size(B),A(inds),inds)) = 1;

如果需要,您可以将其组合成一行,为了清晰起见,我将其保留为多行。

这是一种紧凑、无环的设计,它可以工作:

B = zeros(max(A), length(A)); 
inds = find(A > thresh);
B(sub2ind(size(B),A(inds),inds)) = 1;
INDICES = A(:) + length(A)*[0:length(A)-1]';                          %#' 
INDICES(A<42) = [];
B(INDICES) = B(INDICES)+1;
index=A(:)+length(A)*[0:length(A)-1];%

指数(A这是一种紧凑、无环的方法,它可以:

INDICES = A(:) + length(A)*[0:length(A)-1]';                          %#' 
INDICES(A<42) = [];
B(INDICES) = B(INDICES)+1;
index=A(:)+length(A)*[0:length(A)-1];%
指数(A另一种解决方案(灵感来源于):

另一个解决方案(受以下启发):



你能举一个小的矩阵例子说明你正在努力完成什么,以便更容易理解目标吗?@t皮尔斯,我添加了一个小例子。@t皮尔斯我修改了标题。我现在想做什么更容易理解吗?是的,这更容易理解。你能举一个小矩阵例子说明你正在努力完成什么,以便更容易理解吗呃,为了理解目标?@tmpearce,我添加了一个小例子。@tmpearce我修改了标题。我现在想做什么更容易理解吗?是的,这更容易理解。看起来你的解决方案比我的好,因为我不知道sub2ind。但我的解决方案比你的好,因为他要求增加B,而不是将其设置为1。我假设他正在处理不止一个矩阵“A”,并希望在B中累积结果(我们基本上有相同的解决方案,我显然花了太长时间才得出我的解决方案)。看起来你的解决方案比我的好,因为我不知道sub2ind。但我的解决方案比你的好,因为他要求增加B,而不是将其设置为1。我假设他正在处理多个矩阵“A”,并希望在B中累积结果。(我们基本上有相同的解决方案,我显然花了太长时间才想出我的解决方案)。很高兴知道
sparse
的这种语法,但在这里它对我来说用处不大。我有很多
A
和一个B用于计算。我应该在我的问题中更清楚地说明这一点。:-/实际上我不知道你的解决方案是否正确(w/o
full
)或tPearce解决方案会更快。如果我有时间,我会研究一下。@kay:如果我理解正确,你可以简单地将计数累加到B:
B=0(…);
然后
B=B+full(稀疏(…)
每一个都是。但是为什么我需要
完整的
?@kay:你不需要它,我只是假设你在使用密集矩阵。你可以将B初始化为:
B=sparse(max(A),length(A));
然后在B中为每一个A:
B=sparse(…);
。然后可以选择调用
B=full(B)
结尾处也很高兴知道
稀疏的这个语法,但在这里它对我没什么用处。我有很多
A
s和一个B在计算。我应该在我的问题中更清楚地说明这一点。:-/实际上我不知道你的解决方案(w/o
完整的
)或者t Pearce解决方案会更快。如果我有时间,我会研究一下。@kay:如果我理解正确,你可以简单地将计数累加到B:
B=0(…);
然后
B=B+full(稀疏(…)
每一个都是。但是为什么我需要
完整的
?@kay:你不需要它,我只是假设你在使用密集矩阵。你可以将B初始化为:
B=sparse(max(A),length(A));
然后在B中为每一个A:
B=sparse(…);
。然后可以选择在末尾调用
B=full(B);