如何从符合以下条件的矩阵Md
中获取矩阵M
:
如果M
是:
M=[0.000000 1188.000000 340.216815
0.000000 1186.437500 570.718050
0.000000 1183.312500 769.256473
6.500000 1188.500000 331.115127
6.500000 1186.963013 510.419428
6.500000 1183.889160 719.346166
13.000000 1189.000000 325.858265
13.000000 1187.488647 426.599681
13.000000 1184.465942 671.896040
19.500000 1189.000000 330.567837
19.500000 1187.529785 383.856624
19.500000 1184.589478 643.279493
26.000000 1190.000000 333.606362
26.000000 1188.539795 381.784469
26.000000 1185.619263 648.680568];
找到M(:,2)
的最大值,其中M(:,1)
等于(0,6.5 .. 26),这是:
for i=0:6.5:26
ind = M(:,1) == i;
max(M(ind,2))
end
获取
ans = 1188
ans = 1188.5
ans = 1189
ans = 1189
ans = 1190
想法是使用这些最大值,以将它们减去M(:,2)
中其他值,其中M(:,1)
等于(0,6.5 .. 26)。例如:M(:,2)
中的最大值,其中M(:,1)=0
是1188,那么我们将从1188中减去:1188、1186.437500和1183.312500,它们是与{{1 }}。
M(:,2)
然后对6.5、13..26执行相同操作。结果将是:
M(:,1)=0
答案 0 :(得分:0)
一种解决方案可以使用将第一列分组来为每个组计算max
:
maxs = accumarray(M(:,1), M(:,2), [], @max);
此外,由于两个浮点数与==
的比较可能是错误的,因此最好使用this method。
答案 1 :(得分:0)
您快到了:
for i=0:6.5:26
ind = M(:,1) == i;
m = max(M(ind,2));
M(ind,2) = m - M(ind,2);
end
我刚刚在问题代码中添加了一行。该行按照您的指定执行:从行ind
的最大值中减去第二列中的值,然后将其分配回这些单元格中。
在这里,我们正在修改M
而不是创建新的矩阵Md
,可以通过从矩阵的副本开始对其进行修复。
也许有一些方法可以不使用循环,但是除非事实证明这是代码的瓶颈,否则请保持简单易懂!