2013-09-06 4 views
2

Удивление, может ли кто-нибудь помочь мне с этим.Matlab: столбец пустой матрицы

Для получения первого столбца x матрицы A. Использую x = A (:, 1). Так часто матрица A пуста, и в этом случае я бы хотел, чтобы мой столбец был пуст. Но с Matlab код выходит с ошибкой «Index превышает размеры матрицы». Есть ли способ предотвратить его выход, а вместо этого дать мне []?

(Я мог бы, конечно, написать «если» заявление, используя IsEmpty (A), но это раздражает, поскольку мой код наполнен множеством мест, где я, возможно, пустые матрицы.)

+0

Возможно, вы можете использовать массивы ячеек, которые могли бы иметь: 'A {1} = []' или 'A {1} = rand (10,1)' и всегда обращаться к нему как: 'x = A {1} ' – Amro

ответ

3

Это своего рода неуклюжим, но это работает, и короче, чем if или try:

A(:,1:min(1,size(A,2))) 

или

A(:,1:9999999999:size(A,2)) 
+2

почему нисходящий? Это совершенно справедливо и умный трюк. Первый можно сделать более дружественным: 'A (:, 1: min (1, end))'. То же самое для второго: 'A (:, 1: end + 1: end)'. Тем не менее, я бы не использовал его в своем коде :) – Amro

+0

@Amro wow, я никогда не знал, что вы можете использовать 'end' в качестве аргумента функции. –

+0

@BasSwinckels: это происходит из-за того, что вы также можете перегружать метод ['end'] (http://www.mathworks.com/help/matlab/ref/end.html) для пользовательских классов и настраивать поведение индексации для объектов: http://www.mathworks.com/help/matlab/matlab_oop/indexed-reference-and-assignment.html#br1dtdk-1 – Amro

3

Вы можете использовать логическую индексацию:

A(:,end>0); 

Для непустых матриц будет

A(:,logical(1)); 

, которая возвращает первый столбец, а для пустых матриц будет

A(:,logical(0)); 

который возвращает пустую матрицу столбцов.

+0

+1 еще один умный трюк – Amro

+0

Не логическое индексирование должно быть того же размера, что и индексируемый размер массива? Кажется, что работает, но –

+1

@BenVoigt Нет, это не так, только те столбцы, которые выбраны, должны существовать. Итак, для матрицы 2 на 2 можно использовать 'A (:, logical ([0 1 0])', но не 'A (:, logical ([0 0 1])'. –