在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
。
这很简单。确保 C
与 A
的总行数大小相同,因此:
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
中的总列数相同。
我想在不同的列中找到相同的数字值, 例如我有一个矩阵数组:
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
。
这很简单。确保 C
与 A
的总行数大小相同,因此:
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
中的总列数相同。