2015-08-05 2 views
0

Вот часть моей функции, я хочу пропустить 4 набора данных в свою функцию blood_type.Применить ту же функцию несколько раз с разными наборами аргументов

В каждом наборе один из аргументов - numeric, а другой - character.

Для выходных данных Type и Vol каждая из них представляет собой трехмерную матрицу размером 80*80*2.

enter image description here

Я хочу иметь аккуратный способ, таким образом, что можно получить ALL_TYPE, который является результатом конкатенации с помощью 4 выходов blood_type (каждый тип из каждой patient_id и patient_name).

ALL_TYPE = cat(3, Type1, Type2, Type3, Type4)

Кроме того, я хочу иметь

ALL_VOL = cat(3, Vol1, Vol2, Vol3, Vol4)

Вместо написания:

[Type1 Vol1] = blood_type(1, 'Ann'); 
[Type2 Vol2] = blood_type(2, 'Ben'); 
[Type3 Vol3] = blood_type(3, 'Chris'); 
[Type4 Vol4] = blood_type(4, 'David'); 

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

Заранее спасибо.

+0

Ваша проблема кажется немного странной: как программа узнает, о чем «blood_type» просить, если вы не укажете имя пациента и его идентификатор? Это означает, что вам нужно будет ввести по крайней мере одно имя пациента и их идентификатор. Но вы хотите этого избежать. –

ответ

2

Вот подход, используя cellfun;

%'The arguments of the function need to be typed once anyways' 
patient_id = {1,2,3,4}; 
patient_name = {'Ann','Ben','Chris','David'}; 

[ALL_TYPE, ALL_VOL] = cellfun(... 
    @blood_type, patient_id, patient_name, ... 
    'UniformOutput', false ... 
); 

ALL_TYPE = cat(3, ALL_TYPE{:}); 
ALL_VOL = cat(3, ALL_VOL{:}); 
+1

Nice and simple =) @nam: Обратите внимание, что хотя 'cellfun' является опрятным, и его легко читать и писать, это просто замаскированный for-loop. –

+0

@CST Спасибо за ваше решение и @stewie Спасибо за ваше напоминание об объяснении 'cellfun'. – nam

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