0

Мне нужно сделать функцию, которая принимает 3 входа, например e0, e1 и e2. Функция будет иметь 2 выхода x и y.Matlab - генерирующие комбинации ввода и их сумма

x будут представлять собой комбинации e0, e1 и e2. y будет вектор-столбец, содержащий суммы столбцов x.

Следующие условия должны быть выполнены при создании функции:

  1. входы e0, e1 и e2 имеют одно число.
  2. , если пользователь не вводит значение для ввода, которое оно установило равным 0 по умолчанию.
  3. Если пользователь не вводит какие-либо данные, тогда должно отображаться сообщение о том, что вход не введен.

Вот пример:

combination pattern of X (first 3 columns):  pattern for y is the sum of x 
1 1 1           3 
2 1 1           4 
3 1 1           5 
1 2 1           4 
2 2 1           5 
3 2 1           6 
1 3 1           5 
2 3 1           6 
and so on...       and so on.... 

До сих пор я только был в состоянии сделать это много с x и y отображаются отдельно.

function [x,y]=create(e0,e1,e2) 
switch nargin 
case 2 
    e1=0; 
    e2=0; 
case 1 
    e2=0; 
case 0 
    disp('no input') 
end 

Я гугл моей проблемы и обнаружил, что combvec и allcomb должно помочь, но я не могу понять, как .. Пожалуйста, помогите любому ответу или намек будет большая помощью.

ответ

1

Вы были на правильном пути с allcomb.Вы на самом деле ищете cartesian product:

[e0, e1, e2] x [e0, e1, e2] x [e0, e1, e2] == [e0, e1, e2]^3. 

Вам не нужно allcomb хотя, как ndgrid может already do this.

Начнем с кода. У него есть ошибка. В основном case 2 и case 1 перевернуты.

function [x,y] = create(e0,e1,e2) 
switch nargin 
case 2 
    e1=0; % <- When nargin==2, this value is set, and you overwrite it. 
    e2=0; 
case 1 
    e2=0; % <- When nargin==1, e1 must also be set to zero. 
case 0 
    disp('no input') % <- use `error` instead of `disp`? If not, use `return` here. 
end 

Вам необходимо будет проверить, что предоставленные номера не являются матрицами. Это может быть достигнуто с чем-то подобным. (Заполните пропуски.)

assert(numel(e1)==1 && numel(__)___ && numel(__)___,'Input sizes are incorrect'); 

Сформировать декартово произведение [e0, e1, e2] x [e0, e1, e2] x [e0, e1, e2] вы ищете, вы можете использовать либо this answer для allcomb или this answer для встроенного ndgrid.

sets = {[e0,e1,e2], [e0,e1,e2], [e0,e1,e2]}; 

cartProd1 = allcomb(sets{:}) 

[x y z] = ndgrid(sets{:}); 
cartProd2 = [x(:) y(:) z(:)] 

Вы можете поменять местами столбцы cartProd, если вы хотите, правильный порядок. Для получения суммы по строкам используйте

sum(cartProd,2) 
+0

Большое спасибо. Ваш ответ мне очень помог. Теперь я ясно понимаю, что я делаю неправильно. –

+0

@Frankwiene: Мое удовольствие! – knedlsepp

0

Вы хотите, чтобы перестановки не были комбинациями. Вы указали, что 2 3 1 и 3 2 1 отличаются друг от друга, но если бы вы сделали это сочетание, вы бы считали их одинаковыми. Таким образом, я буду называть вас на этот пост вместо:

How to find all permutations (with repetition) in MATLAB?

Я специально собирался взять Rody Oldenhuis «s ответ. Таким образом, вы можете построить все возможные перестановки по:

x = unique(nchoosek(repmat([e0 e1 e2], 1, 3), 3), 'rows'); 

Это создаст массив из всех возможных перестановок с e0e1 и e2. Таким образом, используя ваш пример с e0 = 1, e1 = 2, e2 = 3, мы получаем:

x = 

    1  1  1 
    1  1  2 
    1  1  3 
    1  2  1 
    1  2  2 
    1  2  3 
    1  3  1 
    1  3  2 
    1  3  3 
    2  1  1 
    2  1  2 
    2  1  3 
    2  2  1 
    2  2  2 
    2  2  3 
    2  3  1 
    2  3  2 
    2  3  3 
    3  1  1 
    3  1  2 
    3  1  3 
    3  2  1 
    3  2  2 
    3  2  3 
    3  3  1 
    3  3  2 
    3  3  3 

Теперь, наконец, получить то, что вы хотите, вы просто суммировать по строкам, так что:

y = sum(x, 2) 

y = 

    3 
    4 
    5 
    4 
    5 
    6 
    5 
    6 
    7 
    4 
    5 
    6 
    5 
    6 
    7 
    6 
    7 
    8 
    5 
    6 
    7 
    6 
    7 
    8 
    7 
    8 
    9 

Вы уже написано дело, когда пользователь ничего не вводит для e0, e1 и/или e2, так что вам нужно всего лишь взять ваш код и передать то, что я написал выше, в вашу функцию. Он должен дать то, что вы хотите.

+0

Большое спасибо за ваш ответ. Это была большая помощь. –

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