我将使用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
中计算。 lags
为H
,但向下舍入,然后加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
循环的情况下执行此操作吗?
答案 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)
答案 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函数。