不同矩阵的2个值匹配。现在更改同一行中的另一个值

时间:2018-02-18 22:14:46

标签: matlab

所以我有两个矩阵,如果此矩阵A的第1列中的值等于矩阵B的第一列中的值,我想要替换矩阵A的第2列中的值。此替换值是矩阵B的第二列中的值。

所以:A =

1   0
2   Inf
3   Inf
4   Inf
5   Inf
6   Inf
7   Inf
8   Inf
9   Inf
10  Inf

而且B =

5   563,4
7   327,9

我想: A =

1   0
2   Inf
3   Inf
4   Inf
5   563,4
6   Inf
7   327,9
8   Inf
9   Inf
10  Inf

我正在尝试(如果可能的话)避免使用for循环,因为它们在大多数情况下都是低效的。 此外,我应该提到矩阵B在每个循环上改变大小

1 个答案:

答案 0 :(得分:0)

使用ismember function,这很容易实现:

A = [
  1   0
  2   Inf
  3   Inf
  4   Inf
  5   Inf
  6   Inf
  7   Inf
  8   Inf
  9   Inf
  10  Inf
];

B = [
  5   563.4
  7   327.9
];

% Create a logical indexing for the values of
% the first column of A that are present in
% the first column of B...
idx = ismember(A(:,1),B(:,1));

% Replace the values of the second column of A
% with the values of the second column of B
% for the indices defined above...
A(idx,2) = B(:,2);

输出:

A =
     1         0
     2       Inf
     3       Inf
     4       Inf
     5     563.4
     6       Inf
     7     327.9
     8       Inf
     9       Inf
    10       Inf

另一方面,在剪切的代码中执行的计算也可以转换为单行,如下所示:

A(ismember(A(:,1),B(:,1)),2) = B(:,2);

如果您只想替换A中等于Inf的值,则需要采取进一步措施。必须通过逻辑运算符&将另一个条件应用于索引,以便仅匹配正确的值。必须创建BA的索引,才能应用相同的条件:

A = [
  1   0
  2   Inf
  3   Inf
  4   Inf
  5   233.4
  6   Inf
  7   Inf
  8   Inf
  9   Inf
  10  Inf
];

B = [
  5   563.4
  7   327.9
];

A_idx = ismember(A(:,1),B(:,1)) & (A(:,2) == Inf);
B_idx = (A(ismember(B(:,1),A(:,1)),2) == Inf);
A(A_idx,2) = B(B_idx,2);

输出:

A =
     1         0
     2       Inf
     3       Inf
     4       Inf
     5     233.4
     6       Inf
     7     327.9
     8       Inf
     9       Inf
    10       Inf