2010-04-29 3 views
4

Это, кажется, очень распространенная проблема у меня:Как сжать матрицу, используя маску массива в MATLAB?

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 и применил его к каждому столбцу вручную, когда вы можете использовать это понятие, чтобы сделать это одним выстрелом.

ответ

12

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

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

ans = 

    1  3 
    4  6 

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

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

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

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

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

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

+0

Спасибо, я знал, что это было что-то простое. Никогда не рассматривал использование понятия: с маской. Я использовал только один индекс. – Pyrolistical

Смежные вопросы