如何在匹配矩阵条件的矩阵中减去一个值?

时间:2018-12-28 14:39:37

标签: matlab if-statement conditional-statements

如何从符合以下条件的矩阵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

2 个答案:

答案 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,可以通过从矩阵的副本开始对其进行修复。

也许有一些方法可以不使用循环,但是除非事实证明这是代码的瓶颈,否则请保持简单易懂!