2014-11-18 2 views
1

Я хочу написать встроенную функцию, которая примет два аргумента, в которых один аргумент является вектором.Как написать встроенную функцию, которая примет два аргумента в MATLAB

>>nCk = @(n,k)(nchoosek(n,k)); 
>>nCk(3,1:2) 
Error using nchoosek (line 29) 
The second input has to be a non-negative integer. 

Как сделать второй аргумент приемлемым для вектора.

+0

Я уверен, что вы проверили руководство уже, но я думаю, что 'k' должно быть« скалярным, реальным, неотрицательным значением ». 'n' может быть« скалярным, реальным, неотрицательным значением или вектором числовых, логических или значений символов ». См. [Nchoosek] (http://uk.mathworks.com/help/matlab/ref/nchoosek.html) – kkuilla

ответ

8

Как уже упоминалось, nchoosek допускает только целые входы для второго аргумента. Если вы хотите сделать функцию инлайн, вы можете сбросить петлю в вызов arrayfun, однако:

nCk = @(n,kVec)arrayfun(@(k)nchoosek(n,k),kVec); 

И использовать так:

nCk(5,0:5) 

ans = 

1  5 10 10  5  1 
+0

Отличная работа! – Vinod

3

Хотя его, вероятно, не то, что вы хотите, я думаю, что это одна ситуация, в которой я хотел бы использовать для цикла, так как nchoosek принимает только целое число для его k значение:

nCk = @(n,k)(nchoosek(n,k)); 
n = 3; 

for k = 1:2 
    disp(nCk(n,k)); 
end 

Хотя, если вы это делаете это путь, то встроенный оператор, вероятно, излишний, так что это может быть уменьшено до:

n = 3; 

for k = 1:2 
    disp(nchoosek(n,k)); 
end 
+0

цикл - лучший выбор, я думаю. – Rashid

0

с here, вы можете увидеть, что вы можете иметь в качестве вектора первого аргумента, а не второй.

Таким образом, вы можете использовать:

nCk = @(k,n)(nchoosek(k,n)); 

Если это поможет вам конечно

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