1

我有一个形式的矩阵:

m = 1, 0, 10, 20, 30, 40, 50;
    2, 1, 11, 20, 30, 40, 50;
    3, 0, 12, 20, 30, 40, 50;
    4, 1, 12, 21, 30, 40, 50;

对于给定的列索引(比如 3)和行索引(比如 1),我想过滤掉该行中该列右侧具有相同值的所有行。使用上面的 m、columnIndex = 3 和 rowIndex = 1 的示例(用星号表示):

                  **
f(m, 3) = * 1, 0, 10, 20, 30, 40, 50;    % [20, 30, 40, 50] matches itself, include
            2, 1, 11, 20, 30, 40, 50;    % [20, 30, 40, 50] matches the subvector in row 1, include
            3, 0, 12, 20, 30, 40, 50;    % [20, 30, 40, 50] matches the subvector in row 1, include
            4, 1, 12, 21, 30, 40, 50;    % [21, 30, 40, 50] does NOT match the subvector in row 1, filter this out

我怎样才能实现这种行为?我已经尝试过了,但我遇到了尺寸不匹配错误。

key = data( rowIndex, columnIndex:end );
filteredData = ( data( :, columnIndex:end ) == key );
4

2 回答 2

3

索引您保留的==内容bsxfun()

r = 3;
c = 2;

idx = all(bsxfun(@eq, m(:,c:end),m(r,c:end)),2);
m(idx,:)
于 2013-06-19T19:05:46.243 回答
0

我认为您正在寻找使用此处isequal记录的运算符。

isequal(m(1,columnIndex:end),key)

这是一种效率低下的单班轮:-)

cellfun(@(x) isequal(key,x),mat2cell(m(:,columnIndex:end),ones(1,size(m,2)-columnIndex+1)))

这是怎么回事

  1. 将矩阵更改为我们感兴趣的子向量的元胞数组:mat2cell(m(:,columnIndex:end),ones(1,size(m,2)-columnIndex+1))
  2. 在每个单元格元素上运行的匿名函数:@(x) isequal(key,x)
  3. 使每个单元格元素传递给匿名函数的函数,cellfun

我的回答以m上面为例:

cellfun(@(x) isequal(key,x),mat2cell(m(:,columnIndex:end),ones(1,size(m,2)-columnIndex+1)))

ans =

     1
     1
     1
     0

于 2013-06-19T18:49:13.290 回答