Преобразуйте выходные данные функции Matlab (массив ячеек) в список через запятую без временного массива ячеек. - PullRequest
0 голосов
/ 25 июня 2018

Как видно из заголовка, как массив ячеек, который является выходом функции matlab, может быть непосредственно преобразован в список через запятую без использования временного массива?

Т.е. я знаю, что вы можете написать

% functioning code
tmp = cell(1,3); % function that makes a temporary cell_array;
b = ndgrid(tmp{:}); % transform tmp into a 
% comma-separated list and pass into another function

Я ищу способ, позволяющий мне сделать это таким образом, как

% non functioning code
b = ndgrid( cell(1,3){:} );

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

fun = @(x)accept_list( make_a_cell(x){:} );

Как этого достичь?Я думаю, что должна быть функция, вызываемая при использовании оператора '{:}', но какой это будет?

РЕДАКТИРОВАТЬ для пояснения:

Решение в ответе, котороеэтот вопрос был помечен как возможный дубликат, не решает проблему, потому что subsref не является заменой {:} при создании списка через запятую.

Пример:

a = {1:2,3:4}
[A1,A2] = ndgrid(subsref(a, struct('type', '{}', 'subs', {{':'}})));

(ошибочно)

A1 =
     1     1
     2     2
A2 =
     1     2
     1     2

, но

a = {1:2,3:4}    
[A1,A2] = ndgrid(a{:});

возвращает (правильно)

A1 =
     1     1
     2     2
A2 =
     3     4
     3     4

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы можете использовать string ':' в качестве индекса. Этот синтаксис всегда кажется мне странным, но во многих случаях он работает.В вашем примере

tmp = cell(1,3);
b = ndgrid(tmp{:})

b =

   Empty array: 0-by-0-by-0

    b = ndgrid( cell(1,3){:} )
Error: ()-indexing must appear last in an index expression.

Теперь, если вы создаете фиктивную переменную, скажем s = {':'};, вы можете обойти ошибку, выполнив следующее:

b = ndgrid( cell(1,3){s{1}} )

b =

   Empty array: 0-by-0-by-0

Другой вариант - просто использовать':' напрямую.b = ndgrid( cell(1,3){':'} );

Вот пример использования num2cell

A = reshape(1:12,4,3);
A(:,:,2) = A*10;
a = {A, 1};
num2cell(a{':'})

ans(:,:,1) = 

    [4x1 double]    [4x1 double]    [4x1 double]


ans(:,:,2) = 

    [4x1 double]    [4x1 double]    [4x1 double]
a = {A, 2};
num2cell(a{':'})

ans(:,:,1) = 

    [1x3 double]
    [1x3 double]
    [1x3 double]
    [1x3 double]


ans(:,:,2) = 

    [1x3 double]
    [1x3 double]
    [1x3 double]
    [1x3 double]
0 голосов
/ 25 июня 2018

Хорошо, ответ (см. Комментарии Сардара Усамы в комментариях выше), чтобы заменить

fun = @(x)accept_list( make_a_cell(x){:} );

от

tmpfun = @(cell_arg, fun_needs_list)fun_needs_list( cell_arg{:} );
fun = @(x)tmpfun(make_a_cell(x), accept_list);
...