如何使用函数交叉处理矩阵维度错误?

时间:2017-03-01 10:15:26

标签: matlab matrix matrix-multiplication intersect

我有一个1000x1000矩阵A(包含从0到150的值)和一个181x1向量B.在我的矩阵A中,我想只保留B中存在的那些值,同时保持A具有相同的值尺寸。 我尝试使用ismember函数,但它没有给出我期望的结果。所以我尝试了另一个功能 这是我作为代码所做的事情

A=A.*intersect(A,B,'stable');

但我有这个错误

Error using  .* 
Matrix dimensions must agree.

如何解决问题?

2 个答案:

答案 0 :(得分:2)

此任务所需的全部内容为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显示的代码负责这一点,正如评论中已经解释过的那样。

答案 1 :(得分:1)

使用随机数创建两个矩阵ABC是一个数组,其值均位于AB中,使用ismember我们可以选择A中要保留的值。

A = randi([0 150], 1000, 1000);
B = randi([0 150], 181, 1);
C = intersect(A, B, 'stable');
A(~ismember(A, C)) = 0;