使用"查找"命令累加值"没有for循环"

时间:2015-10-14 23:51:20

标签: matlab loops for-loop find

我将使用find从矩阵(名为lag)中获取索引,然后将来自另一个矩阵(H)的相应值相加。这将需要for循环。 (矩阵是2D。)

max在这里用来暗示一个通用的例子)

D=zeros(max, 1)
for j = 1:max
    ind = find(lag==j)
    D(j) = sum(H(ind))
end

这是一个4点的例子。点位于(1,1),(1,2),(2,1),(2,2)。这是地统计方法的一部分。所有点之间的距离已在H中计算。 lagsH,但向下舍入,然后加1,将距离与其最接近的整数(称为滞后的分类)相关联。我现在想要将每个lag的总距离加到向量D中。

lag(4x4) - 存储一般滞后间隔

1  2  2  2
2  1  2  2
2  2  1  2
2  2  2  1

H(4x4) - 存储点之间的距离

0   1   1   1.414
1   0   1.414   1
1   1.414   0   1
1.414   1   1   0

我可以在没有for循环的情况下执行此操作吗?

3 个答案:

答案 0 :(得分:2)

您可以使用

执行此操作
ulag = unique(lag); %contains [1 2]
D = arrayfun(@(l)sum(H(lag==l)),ulag);

unique(lag)会在您的小例lag中将[1 2]提炼为唯一值。然后arrayfun将遍历数组ulag,对于每个元素l,它将执行sum(H(lag==l)),它完全按照您的要求执行操作:对{{1}中的元素求和} H中的对应元素等于lag。请注意,这仅在l包含整数时才能正常工作,否则lag可能由于机器精度而找不到相同的元素(但是从我的问题中我收集到它本身可能是整数)。

另请注意,上述两行也可以写成一行:

unique

我只是认为分离后可能更容易消化。

另请注意,上述内容使用D = arrayfun(@(l)sum(H(lag==l)),unique(lag)); 的值从1开始到无最大值的最大值。如果不是这种情况,那么你应该做一些像

这样的事情
lag

但在这种情况下,您必须确保D(unique(lag)) = arrayfun(@(l)sum(H(lag==l)),unique(lag)); 不包含非正值。

答案 1 :(得分:2)

使用accumarray

可轻松完成此操作
D = accumarray(lag(:), H(:));

这会累积(求和)第一个参数的行值定义的每个组的第二个参数的值。

答案 2 :(得分:0)

没有for循环,没有一种好方法可以做到这一点,但你可以不使用find来完成。

D = zeros(N, 1)
for j = 1:N
   D(j) = sum(sum((lag == j).*H));
end

lag == j的结果将是布尔值的4x4(或更确切地说是NxN)矩阵,这样(lag == j).*H将保留每个滞后的距离,但对所有其他元素都有零。汇总(lag == j).*H中的所有元素将为D(j)提供相同的答案。

注意我已将max切换为N,因为max是内置的MATLAB函数。