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(:));