2012-01-28 4 views
2

Как применить функцию, которая возвращает нескалярный вывод в массивы с использованием arrayfun? KGПрименение функции в массиве, которая выводит выходные значения с разным размером в векторном виде

0 Например: - как вектовать код?

array = magic(5); 
A = cell(size(array)); 
for i=1:5 
    for j=1:5 
     A{i,j} = 1:array(i,j); 
    end 
end 

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

array = magic(5); 
result = arrayfun(@(x)(1:x),array); 

ответ

6

Есть 2 способа его достижения:

Можно установить «UniformOutput» к ложному. Затем результатом является массив ячеек.

result = arrayfun(@(x)(1:x),array,'UniformOutput',false); 

Но есть хороший трюк, который я нашел сегодня, сама функция может вернуть ячейку. Это устраняет необходимость ввода 'UniformOutput',false каждый раз.

result = arrayfun(@(x){1:x},array) 

Что действительно интересно здесь, что я не должен набрать @(X)({1:x}) но я могу определить его только с помощью фигурных наручи @(X){1:x}

Edit (1): Как @Jonas правильно указывает неудивительно, что регулярные браслеты () не нужны, так как они не являются обязательными. Например, @(x) x+1 является допустимым синтаксисом.

Редактировать (2): Существует небольшая разница между использованием метода фигурных фигур или UniformOutput,false. Когда входной массив пуст, их поведение отличается.

+5

Вы никогда не нужны круглые скобки вокруг этой функции. Но это помогает с видимостью. Кроме того, 'arrayfun' не * действительно * векторизовать код, он просто скрывает цикл (и позволит Matlab многопоточно, если это стоит времени). Обратите внимание, что «трюк» ячейки очень полезен для «аккумулятора», который не имеет опции «uniformOutput». – Jonas

+1

Вот для чего СОСТОЯТСЯ :) – Jonas

1

В дополнение к ответу Андрея, я хочу отметить, что, кажется, что первый подход, с помощью опции UniformOutput, немного быстрее:

>> tic; cellfun(@(x) {single(x)}, data); toc; 
Elapsed time is 0.031817 seconds. 

>> tic; cellfun(@(x) single(x), data,'UniformOutput',0); toc; 
Elapsed time is 0.025526 seconds. 

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

  • Нет связанных вопросов^_^