如何解决函数相交的矩阵维数错误?
How to work around a matrix dimension error with funtion intersect?
我有一个 1000x1000 的矩阵 A(包含从 0 到 150 的值)和一个 181x1 的向量 B。在我的矩阵 A 中,我想只保留 B 中存在的那些值,同时保持 A 与相同的大小。
我尝试使用 ismember 函数,但它没有给我预期的结果。所以我尝试了另一个功能
这是我做的代码
A=A.*intersect(A,B,'stable');
但是我有这个错误
Error using .*
Matrix dimensions must agree.
我该如何解决问题?
用随机数创建两个矩阵,A
和 B
。 C
是一个数组,其值都在 A
和 B
中,使用 ismember
我们可以 select 保留 A
中的哪些值。
A = randi([0 150], 1000, 1000);
B = randi([0 150], 181, 1);
C = intersect(A, B, 'stable');
A(~ismember(A, C)) = 0;
您只需要 ismember
即可完成此任务,如下所示:
A = A.*ismember(A,B);
% ismember(A,B) gives the logical matrix containing 1's for the indexes whose values
% are present in `B` and 0's for all other indexes. When this logical matrix is
% element-wise multiplied with A, all the indexes of A whose elements are not in B
% become zero
为什么你的代码不起作用?
这是因为使用 intersect
(A, B, 'stable')
,您得到的列向量包含(很可能)小于或(极不可能)等于 A
的元素数。即使相等,将它与 A
逐元素相乘时也会出现相同的错误,因为 A
不是列向量。逐元素乘法要求两个矩阵的顺序相同,因为只有这样才能将一个矩阵的每个元素与另一个矩阵中的相应元素相乘。
我上面用 ismember
显示的代码处理了这个问题,正如评论中已经解释的那样。
我有一个 1000x1000 的矩阵 A(包含从 0 到 150 的值)和一个 181x1 的向量 B。在我的矩阵 A 中,我想只保留 B 中存在的那些值,同时保持 A 与相同的大小。 我尝试使用 ismember 函数,但它没有给我预期的结果。所以我尝试了另一个功能 这是我做的代码
A=A.*intersect(A,B,'stable');
但是我有这个错误
Error using .*
Matrix dimensions must agree.
我该如何解决问题?
用随机数创建两个矩阵,A
和 B
。 C
是一个数组,其值都在 A
和 B
中,使用 ismember
我们可以 select 保留 A
中的哪些值。
A = randi([0 150], 1000, 1000);
B = randi([0 150], 181, 1);
C = intersect(A, B, 'stable');
A(~ismember(A, C)) = 0;
您只需要 ismember
即可完成此任务,如下所示:
A = A.*ismember(A,B);
% ismember(A,B) gives the logical matrix containing 1's for the indexes whose values
% are present in `B` and 0's for all other indexes. When this logical matrix is
% element-wise multiplied with A, all the indexes of A whose elements are not in B
% become zero
为什么你的代码不起作用?
这是因为使用 intersect
(A, B, 'stable')
,您得到的列向量包含(很可能)小于或(极不可能)等于 A
的元素数。即使相等,将它与 A
逐元素相乘时也会出现相同的错误,因为 A
不是列向量。逐元素乘法要求两个矩阵的顺序相同,因为只有这样才能将一个矩阵的每个元素与另一个矩阵中的相应元素相乘。
我上面用 ismember
显示的代码处理了这个问题,正如评论中已经解释的那样。