Как сжать матрицу, используя маску массива в MATLAB? - PullRequest
4 голосов
/ 29 апреля 2010

Это, похоже, очень распространенная моя проблема:

data = [1 2 3; 4 5 6];
mask = [true false true];

mask = repmat(mask, 2, 1);

data(mask) ==> [1; 4; 3; 6]

То, что я хотел, было [1 3; 4 6].

Да, я могу просто reshape получить нужный размер, но это кажется неправильным способом сделать это. Есть ли способ лучше? Почему data(mask) не возвращает матрицу, если она на самом деле прямоугольная? Я понимаю, что в общем случае это может быть не так, но в моем случае, поскольку моя первоначальная маска - это массив, она всегда будет.

Следствие

Спасибо за ответ, я просто хотел отметить, что это также работает со всем, что возвращает числовой индекс, например ismember, sort или unique.

Раньше я брал второе возвращаемое значение из sort и применял его к каждому столбцу вручную, когда вы можете использовать это понятие, чтобы сделать его одним выстрелом.

1 Ответ

12 голосов
/ 29 апреля 2010

Это даст вам то, что вы хотите:

>> data = [1 2 3; 4 5 6];
>> mask = [true false true];
>> data(:,mask)

ans =

     1     3
     4     6

Это работает, потому что вы можете просто применить логический индекс mask к столбцам, выделив все строки с помощью :.

Даже если для входа используется двумерный логический массив, выводом будет массив столбцов с индексированными значениями. Это связано с тем, что нет гарантии, что индексированные элементы могут быть организованы в двумерный (то есть прямоугольный) вывод. Подумайте, была ли ваша двумерная маска следующей:

mask = [true false true; true false false];

Это будет индексировать 3 значения, которые не могут быть организованы во что-либо, кроме вектора строки или столбца для вывода. Вот еще один пример:

mask = [true true true; true false false];

Это будет индексировать 4 значения, но 3 - из первого ряда, а 1 - из второго ряда. Как эти значения должны быть сформированы в прямоугольную матрицу вывода? Поскольку в общем случае для произвольной двумерной индексной матрицы не существует четкого способа сделать это, возвращается вектор столбца индексированных значений.

...