所以我有两个矩阵,如果此矩阵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在每个循环上改变大小
答案 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
的值,则需要采取进一步措施。必须通过逻辑运算符&
将另一个条件应用于索引,以便仅匹配正确的值。必须创建B
到A
的索引,才能应用相同的条件:
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