在matlab的另一列中找到相同的值

Find the same values in another column in matlab

我想在不同的列中找到相同的数字值, 例如我有一个矩阵数组:

A = [1  11  0.17
2   1   78
3   4   90
45  5   14
10  10  1]

所以你可以看到没有。第 1 列中的 1 在第 2 列和第 3 列中具有相同的值,因此我想选择该数字并将其放入另一个单元格或矩阵单元格

B= [1]

并执行另一个操作C/B,令C等于:

C= [1
3
5
7
9]

你将拥有:

D= [1   11  0.17    1
2   1   78  3
3   4   90  5
45  5   14  7
10  10  1   9]

然后,第 4 列中的值具有我们可以定义的等效数字,但我们将仅选择那些在其行中具有数字 1 或 B 的数字

定义:

1-->23
3 -->56
9 --> 78

然后我们有,见下图:

那我该怎么做呢?可能吗?谢谢

让我们分步解决您的问题。

步骤 #1 - 确定所有列是否共享一个值

我们可以通过 bsxfun, unique, permute and any and all 智能地做到这一点。

我们首先需要使用unique,这样我们就可以在矩阵A中生成所有可能的唯一值。完成此操作后,我们可以查看唯一值的每个值,并查看 A 中的所有列是否都包含该值。如果是这种情况,那么这就是我们需要关注的数字。

因此,先做这样的事情:

Aun = unique(A);
eqs_mat = bsxfun(@eq, A, permute(Aun, [3 2 1]));

eqs_mat 将生成一个 3D 矩阵,其中每个切片计算出唯一数组中特定值出现的位置。因此,对于每个切片,每一列将有一堆 false 值,但至少有一个 true 值,其中此真值告诉您列中与唯一值匹配的位置。您要做的下一件事是遍历此结果的每一部分,并确定每一列是否至少有一个非零值。

对于要在所有列中共享的值,切片的每列应具有非零值。

我们可以雄辩地确定我们需要提取哪个值:

ind = squeeze(all(any(eqs_mat,1),2));

鉴于您的示例数据,我们将此作为我们的唯一值:

>> B

B =

    0.1700
    1.0000
    2.0000
    3.0000
    4.0000
    5.0000
   10.0000
   11.0000
   14.0000
   45.0000
   78.0000
   90.0000

此外,我在上面执行的最后一条语句给了我们:

>> ind

ind =

     0
     1
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0

上面的意思就是唯一数组的第二个位置就是我们想要的值,这个对应的是1。因此,我们可以通过以下方式提取我们想要的特定值:

val = Aun(ind);

val 包含所有列共享的值。

步骤 #2 - 给定值 B,取一个向量 C 并除以 B

这很简单。确保 CA 的总行数大小相同,因此:

C = [1 3 5 7 9].';
B = val;
col = C / B;

步骤 #3 - 对于 A 中共享公共值的每个位置,我们要生成一个新的第五列,为每个相应的行提供一个新值。

您可以通过声明一个向量...比方说...零来做到这一点,然后找到共享公共值的正确行,并将第五列中的值替换为您想要的值:

zer = zeros(size(A,1), 1);
D = [23; 56; 78];
ind2 = any(A == val, 2);
zer(ind2) = D;

%// Create final matrix
fin = [A col zer];

我们终于得到:

>> fin

fin =

    1.0000   11.0000    0.1700    1.0000   23.0000
    2.0000    1.0000   78.0000    3.0000   56.0000
    3.0000    4.0000   90.0000    5.0000         0
   45.0000    5.0000   14.0000    7.0000         0
   10.0000   10.0000    1.0000    9.0000   78.0000

请注意,您需要确保分配给第五列的内容 的大小A 中的总列数相同。