【问题标题】:Discard elements in a matrix matlab丢弃矩阵matlab中的元素
【发布时间】:2015-02-27 13:46:07
【问题描述】:

我想知道如何在 Matlab 中丢弃矩阵中的元素。 我有一个矩阵“A”,其中包含 8 个人的所有可能组合,对于每个人,我有三个可能的选择,例如:

 A=[1 1 1 1 1 1 1 1;
    1 1 1 1 1 1 1 2;
    1 1 1 1 1 1 1 3;
    1 1 1 1 1 1 2 1;
    1 1 1 1 1 1 2 2;
    1 1 1 1 1 1 2 3;
    1 1 1 1 1 1 3 1 ;
    ....
                   ];

等..所有元素。

现在我有一个新的向量 B=[2 2] 包含前两个人的值,我想从 A 中获得一个具有所有可能组合的新矩阵,如上,丢弃所有不包含前两个人的 B 值。

我希望清楚。

提前致谢

【问题讨论】:

  • 那么,最后一列是第一个人的,第二个人是倒数第二列?
  • 所以,像这样 - A(~ismember(A(:,1:2),[2 2],'rows'),:)?
  • 然后去掉波浪号:A(ismember(A(:,1:2),[2 2],'rows'),:)
  • 如果 B 中只有 2 个元素,那么最快的方法是使用 A(A(:,1) == B(1) & A(:,2) == B(2),:)
  • 更好的选择是不首先创建整个矩阵。

标签: matlab matrix combinations


【解决方案1】:

这应该可行:

sizeA = size(A,1);        % check how long array A is

index = 1;
for ii=1:sizeA
    if ~(A(index,1) == B(1,1)) || ~(A(index,2) == B(1,2))     % if either entry doesn't match
    A(index,:) = [];                                          % clear the line
    else
    index=index+1;                                            % else: move to next line
    end
end

请注意,这绝不是一个优雅的解决方案,因为它不容易适应:cmets 中建议的 ismember 函数 Divakar 更适合该目的:

A(ismember(A(:,1:2),[2 2],'rows'),:)

它的作用是逐行检查前两个条目是否等于[2 2],并且只返回那些行。为澄清起见,这相当于:

indices = ismember(A(:,1:2),[2 2],'rows')
A(indices,:)

其中indices 是一个列向量,其中前两个条目与[2 2] 匹配的每一行包含一个1,否则为0。

【讨论】:

  • 欢迎在其中添加会员解决方案。
  • ismember 是解决方案。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多