Замените определенные записи многомерных массивов, избегая циклов - PullRequest
0 голосов
/ 19 сентября 2019

Я хотел бы заменить запись, соответствующую номеру столбца массива, который является частью трехмерной матрицы, на ноль.Моя матрица имеет размер IxJxJ.В каждом столбце j я могу найти матрицу размером IxJ, которую я хотел бы заменить j -ым столбцом на ноль.

Ниже вы можете найти пример того, что я хотел бы использовать в простой трехмерной матрице A.В этом примере используется цикл, которого я стараюсь избегать.

A(:,:,1) = randi([1,2],5,3);
A(:,:,2) = randi([3,4],5,3);
A(:,:,3) = randi([5,6],5,3);

for i = 1:3
    B = A(:,i,:);
    B = squeeze(B);
    B(:,i) = 0;
    A(:,i,:) = B;
end

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Используйте глаз , чтобы создать логическую маску и применить ее к A.

  A = A .* reshape(~eye(3), 1, 3, 3) ;
1 голос
/ 19 сентября 2019

Во-первых, вы можете заменить 4 строки кода в цикле for на A(:,i,i) = 0;.Я не вижу реальной необходимости избегать цикла for.

Используя линейное индексирование, вы можете сделать

A((1:size(A,1)).'+size(A,1).*(size(A,2)+1).*(0:size(A,2)-1)) = 0

или для более старой версии Matlab без неявного расширения (предварительноR2016b)

A(bsxfun(@plus,(1:size(A,1)).',size(A,1).*(size(A,2)+1).*(0:size(A,2)-1))) = 0

После некоторого очень быстрого тестирования, похоже, решение bsxfun самое быстрое, но различия невелики, ваши результаты могут отличаться.

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