Векторизация конкатенации двоичных операций

#matlab #matrix #vectorization #logical-operators

#matlab #матрица #векторизация #логические операторы

Вопрос:

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

 matrices = 
    [225x400 logical]
    [225x400 logical]
    ....
    [225x400 logical]
  

Массив ячеек потенциально может содержать сотни матриц.

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

т.е.

 result = matrices{1} amp; matrices{2} amp; matrices{3} amp; ..., etc.
  

Мой вопрос: Возможно ли это сделать без цикла? И если да, есть ли какая-либо польза в векторизации этого вычислительного MATLAB?

Что, если стек матриц представлен в виде 3D-массива (вместо массива ячеек?), Например:

   Name                        Size                  

  matrices                  225x400x100
  

Есть ли какая-либо выгода в хранении этих типов стеков в виде массивов ячеек по сравнению с 3D-матрицами? (чтобы уточнить, в этом последнем примере мы бы вычислили AND из 100 матриц, каждая из которых имеет размер 225x400 ).

PS: Меня интересуют решения для AND , XOR и OR

Ответ №1:

Вы не можете выполнять векторизованные вычисления на массивах ячеек. Вы должны преобразовать его в 3D-массив (используя cell2mat ), или даже лучше: предварительно выделить 3D-массив.

Затем с размерами 225x400x100 вы можете сделать:

или:

 any(matrices,3)
  

и:

 all(matrices,3)
  

xor:

 mod( sum(matrices, 3), 2)
  

Преимуществом массивов ячеек является сохранение памяти (например, после удаления ячейки). Как только ваш массив ячеек станет стабильным, вы должны превратить его в матрицу для векторизованных вычислений, что намного быстрее, чем циклы Matlab.

Комментарии:

1. чтобы преобразовать cellarray в 3D-матрицу, используйте следующее: cat(3,matrices{:})