2013-07-05 4 views
3

Мой вопрос: Как я могу выполнить что-то вроде понимания List в Matlab, похожего на Haskell или Python? Для выполнения функции в Matlab, как показано ниже:Как я могу выполнить что-то наподобие List в Matlab?

for xxx 
    if condition 
     expression1;  
    else 
     expression2; 
    end 
end 

Моя первоначальная цель, чтобы сделать использование векторизованных операций и снизить для цикла в моем коде, чтобы сделать его работать быстрее.

РЕДАКТИРОВАТЬ: Я надеюсь, что ответ не нужен, что-то связанное с arrayfun, метод векторной операции более приветствуется.

Существует еще один вопрос, связанный с этим вопросом (через функцию с именем «arrayfun»). Анонимная функция в швах Matlab должна быть только 1 строка, то как я могу написать выражение if-else в ней?

Спасибо всем ~~

+0

Быстрее вводить или быстрее выполнять? Потому что детали того, выполняются ли для циклов, списков или векторизованных операций, очень быстро зависят от отдельного языка. – Marius

+1

Если речь идет о производительности, вы должны определенно сравнить оба решения. 'for' обычно намного быстрее, чем' arrayfun'. –

+1

подобные вопросы: http://stackoverflow.com/q/16555724/97160, http://stackoverflow.com/q/8327013/97160, http://stackoverflow.com/q/9993189/97160, HTTP: // переполнение стека.com/q/10918404/97160 – Amro

ответ

1

arrayfun фактически не избавиться от петель, это просто означает, что вам не придется вводить их в явном виде. Тем не менее, в новых петлях Matlabs они не так уж медленны. Но может быть полностью векторизованный способ делать то, что вы хотите, я не говорю, что это будет неизбежно быстрее (но я думаю, что это будет в более старых матрицах):

Вы можете воспользоваться тем, как Matlab будет автоматически отбрасываться логически удваивать, т. е. false до 0 и true для одного. Например

A = rand(10,1); 

позволяет сказать, что вы хотите, значение выше 0,7 нужно умножить на 2, в противном случае вы должны вычесть 5, то вы можете пойти

(A*2).*(A>0.7) + (A-5).*(A<=0.7);

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

I = A > 0.7; 
A(I) = A(I)*2; 
A(~I) = A(~I) - 5; 

который также полностью в векторе.

+0

Огромное вам спасибо! Вы не только скажите мне метод, который мог бы сэкономить мою проблему без написания другого файла функции, но и предоставить больше информации, чем я ожидал. Извините за отсутствие репутации для голосования. – freealbert

+0

@freealbert Я рад, что это помогло. Вы должны выбрать ответ, чтобы принять его, щелкнув стрелку в левом верхнем углу вопроса. Что бы вы ни считали более правильным для вас, но они оба правы, поэтому вы должны выбрать один. – Dan

+0

Спасибо, Dan, я новичок здесь. Как вы сказали, «новые петли Matlabs не так уж медленны», где я могу найти информацию? », Означает ли это, что нет необходимости использовать векторизованные операции для обеспечения, а« для »может быть выполнено так быстро как векторизованные операции в новом Matlab? – freealbert

1

Вы не можете использовать if в анонимных функций в Matlab. Однако вы можете немного обойти это с помощью arrayfun, указав свою собственную функцию, которая будет выполнять инструкции и условия, например.

function result = iff(condition, v1, v2) 
    if condition 
    result = v1; 
    else 
    result = v2; 
    end 

Тогда в arrayfun вы можете сделать что-то такое, как это:

arrayfun(@(x) iff(mod(x,2)==0, x , 0), [1:10]) 

приводит:

0  2  0  4  0  6  0  8  0 10 

Это основано на ответ на подобный вопрос here.

+0

Это помогает. Большое спасибо! – freealbert

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