【发布时间】:2015-04-22 15:00:23
【问题描述】:
我在 Matlab 中有一个矩阵 A,维度为 mxn。我想构造一个维度为mx1 的向量B,如果A(i,:) 的所有元素都相等,则B(i)=1,否则0。有什么建议吗?例如
A=[1 2 3; 9 9 9; 2 2 2; 1 1 4]
B=[0;1;1;0]
【问题讨论】:
标签: matlab
我在 Matlab 中有一个矩阵 A,维度为 mxn。我想构造一个维度为mx1 的向量B,如果A(i,:) 的所有元素都相等,则B(i)=1,否则0。有什么建议吗?例如
A=[1 2 3; 9 9 9; 2 2 2; 1 1 4]
B=[0;1;1;0]
【问题讨论】:
标签: matlab
这是另一个更模糊的例子,但也能起到作用:
B = sum(histc(A,unique(A),2) ~= 0, 2) == 1;
那么这是如何工作的呢? histc 计算数据集中数字出现的频率或出现次数。 histc 的酷之处在于我们可以独立计算沿维度的频率,因此我们可以做的是分别计算沿矩阵A 每一行的值的频率。 histc 的第一个参数是您要计算其值频率的矩阵。第二个参数表示边缘,或者您要在矩阵中查看哪些值来计算频率。我们可以通过在整个矩阵上使用unique 来指定所有可能的值。下一个参数是我们要操作的维度,我想处理所有列,因此指定了2。
histc 的结果将为我们提供一个M x N 矩阵,其中M 是矩阵A 中的总行数,N 是A 中唯一值的总数。接下来,如果一行包含所有相等的值,则该行中应该只有 一个 值,其中所有值都被分箱在其余值为零的位置。因此,我们确定该矩阵中的哪些值非零并将其存储到结果矩阵中,然后沿结果矩阵的列sum 并查看每一行的总和是否为 1。如果是,则此A 的行具有所有相同的值。
当然不如 Divakar 的 diff 和 bsxfun 方法那么有效,但是因为他采用了我会使用的两种方法,所以可以替代:P
【讨论】:
更多选择:
B = var(A,[],2)==0;
B = max(A,[],2)==min(A,[],2)
【讨论】:
max/min 检查非常非常聪明。 +1。变数也是!甚至可以探索mean:B = mean(A, [], 2) == A(:,1); 尽管有浮点错误。