Как я могу получить доступ к вектору в Matlab при использовании анонимной функции, которая требует ввода - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь перетасовать вектор, который еще не определен, вектор состоит из [0 0 0 ... 0 0 1 2 3 ... (n-zer)]

  • n: длина вектора
  • zer: числонули в начале

примерно так:

PartZeroPartNum=@(zer,n) [zeros(1,zer),1:(n-zer)];
shuffled=@(zer,n) PartZeroPartNum(zer,n)(randperm(n));

не работает, так как эта часть

PartZeroPartNum(zer,n)(randperm(n))

выдает ошибку:

не может вызвать или индексировать во временный массив

Напротив, это работает, если я делаю это так:

n=100;
PartZeroPartNum=logical([zeros(1,zer),1:(n-zer)]);
shuffled=@() PartZeroPartNum(randperm(n));

Возможно ли перетасовать более универсальныйвектор как я пытался сделать выше? может быть, по-другому?

Причина в том, что мне нужно много примеров перемешанных векторов, поэтому я подумал сначала сделать эту анонимную функцию, а затем легко делать выборки, например:

ShVec= shuffled(50,100);

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Есть лучшие способы сделать это, но вы можете добавить еще одну анонимную функцию

PartZeroPartNum=@(zer,n) [zeros(1,zer),1:(n-excited)];
fIndex = @(x,ii) x(ii);
shuffled=@(zer,n) fIndex(PartZeroPartNum(zer,n), randperm(n));

Как уже упоминалось в комментариях, вам лучше использовать функцию в своем собственном m-файле, этобудет наиболее читабельным вариантом, предложенным Крисом.

1 голос
/ 05 ноября 2019

Эквивалентность вызова функции A(index) равна subsref(A, struct('type', '()', 'subs', {index})) см. здесь .

Так что вы можете сделать свою анонимную функцию

PartZeroPartNum=@(zer,n) [zeros(1,zer),1:(n-excited)];
shuffled=@(zer,n) subsref(PartZeroPartNum(zer,n), struct('type', '()', 'subs', {randperm(n)});

Но я бы не сталсделать это не очень читабельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...