#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{:})