Matlab 使用;查找“;“累积值的命令”;“无for循环”;

Matlab 使用;查找“;“累积值的命令”;“无for循环”;,matlab,loops,for-loop,find,Matlab,Loops,For Loop,Find,我将使用find从一个矩阵(名为lag)获取索引,然后从另一个矩阵(H)求和它们相应的值。这将需要一个for循环。(矩阵是二维的。) (max在这里用于暗示一个通用示例) 这是一个4点的例子。点位于(1,1)、(1,2)、(2,1)、(2,2)。这是地质统计学方法的一部分。所有点之间的距离已在H中计算lags是H但向下舍入,然后加上1以将距离与其最接近的整数相关联(一种称为lag的分类)。现在,我想将每个滞后的总距离相加为向量D 滞后(4x4)-存储一般滞后间隔 1 2 2 2 2 1

我将使用
find
从一个矩阵(名为
lag
)获取索引,然后从另一个矩阵(
H
)求和它们相应的值。这将需要一个
for
循环。(矩阵是二维的。)

max
在这里用于暗示一个通用示例)

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

滞后
(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
循环,我可以执行此操作吗?

如果没有
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函数。

您可以使用

ulag = unique(lag); %contains [1 2]
D = arrayfun(@(l)sum(H(lag==l)),ulag);
unique(lag)
lag
提取为唯一值,在您的小示例中
[12]
。然后
arrayfun
将遍历数组
ulag
,对于每个元素
l
,它将执行
sum(H(lag==l))
,这正是您想要的:对
H
lag
中对应元素等于
l
的元素求和。请注意,只有当
lag
包含整数时,这才可以正常工作,否则
unique
可能由于机器精度的原因找不到相同的元素(但从您的问题中,我发现它可能本质上是一个整数)

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

D = arrayfun(@(l)sum(H(lag==l)),unique(lag));
我只是觉得分离后可能更容易消化

还请注意,上面利用了
滞后
的值从1开始到最大值,没有间隙。如果不是这样的话,那么你应该这样做

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

这很容易通过以下方法实现:


对于由第一个参数(
lag
线性化为列向量)的值定义的每组,这将累加(求和)第二个参数(
H
线性化为列向量)的值。

请:1。为
H
lag
添加一些虚拟定义,指出它们的大小,即提供一个;2.不要使用
max
作为变量名,因为这将与matlab内置的
max
函数3冲突。请在命令末尾使用分号以抑制其输出。顺便说一句,对你的问题,答案很可能是“是的”。谢谢安德拉斯。就像一个符咒。我需要学会更多地使用arrayfun!(对不起,支持率太低,还不能投票。)@user24007,很高兴我能帮上忙。但实际上,Luis使用accumarray的解决方案是最好的:它就是为了做到这一点而设计的:)很好!起初我想到了accumarray,但后来我意识到我仍然不知道如何使用它:)这就是应该做的@AndrasDeak是的,
Accumarary
一开始很困难,最多有六个输入参数:-)我终于可以选择您作为最佳答案。谢谢
D(unique(lag)) = arrayfun(@(l)sum(H(lag==l)),unique(lag));
D = accumarray(lag(:), H(:));