Как векторизовать операции на клетках? - PullRequest
0 голосов
/ 21 мая 2018

Учитывая B = {"7" "8" "9"}, я хотел бы использовать его значения в качестве соответствующих замен для конечных элементов каждой ячейки в A, то есть преобразовать

A = {{1 2} {3 4} {5 6}}

в

A = {{1 "7"} {3 "8"} {5 "9"}}

В невекторизованной форме это может быть записано как:

nn = cellfun(@numel, A)
for i = 1:numel(a)
  A{i}{nn(i)} = B{i};
end

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

Единственное решение, которое я нашел, заключается в создании измененной копии A:

nn = cellfun(@numel, A)      #=> 2 2 2
A2 = horzcat(A{:})           #=> {1 2 3 4 5 6}
jj = cumsum(nn)              #=> 2 4 6
[A2{jj}] = B{:}              #=> {1 "7" 3 "8" 5 "9"}
ii = [1 jj(1:end-1)+1]       #=> 1 3 5
A = cellslices(A2,ii,jj,2)   #=> {{1 "7"} {3 "8"} {5 "9"}

Я бы надеялся, что что-то подобное будет работать - но это не так:

octave:1> [[A{:}]{ii}] = B{:}
error: invalid lvalue function called in expression

Есть ли способ векторизации этой операции?

1 Ответ

0 голосов
/ 21 мая 2018

Как видно из комментариев, что вы на самом деле просто хотите избежать явного цикла for / while и можете использовать cellfun (использование которого не является векторизацией), процесс можно повторить с помощью cellfun следующим образом:

A = cellfun(@(k) {A{k}{1:end-1} B{k}}, num2cell(1:numel(A)), 'un', 0);

или arrayfun как:

 A = arrayfun(@(k) {A{k}{1:end-1} B{k}}, 1:numel(A), 'un', 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...