Как перебрать каждое значение в 3D матрице? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть матрица 10x10x40, которая хранит информацию об изображении во времени, где строки и столбцы указывают спектральное значение в определенной точке, а третье измерение - время.Другими словами, изображение 10х10 в 40 точках времени.Я хотел бы пройтись по каждой строке, столбцу и просмотреть историю пикселей (1,1, :), (1,2,:) .... (10,10, :).

Вот что я сейчас делаю:

val = [];
for i = 1:10;
  for j = 1:10;
    for k = 1:length(timevector)
      val(k) = my_matrix(i,j,k); 
    end
  end
end

Поскольку я хочу перебирать каждый пиксель по времени, а затем сохранять эти данные, что будет лучшим способом сохранить новое значение/ векторы времени?Я хочу закончить с 100 пиксельными векторами истории, сейчас я заканчиваю с одним, и это потому, что val записывается в цикле.Я знаю, что не рекомендуется создавать переменные внутри цикла, так какова лучшая альтернатива?Должен ли я смотреть на хранение вывода в виде структуры?Я смотрел на это, и я все слишком усложнил.

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

В зависимости от структуры, которую вы предпочитаете, вы также можете использовать функции Matlab reshape и num2cell, чтобы получить вывод в следующем виде:

Альтернатива 1:

A = reshape(A,[],10);

Это вернет матрицу (100x40), где каждая строка является историей пикселя.

Альтернатива 2:

A = num2cell( reshape(A,[],40), 2)

Это вернет массив ячеек (100x1), где каждая ячейка содержит вектор (40x1) с историей каждого пикселя.

Альтернатива 3:

A = squeeze( num2cell( permute(A, [3,1,2]), 1) );

Это вернет массив ячеек (10x10), где каждая ячейка содержит вектор (40x1) с историей каждого пикселя.

2 голосов
/ 28 марта 2019

В зависимости от того, что вы хотите с ним делать, вам не нужно хранить их в отдельных векторах. Вы можете просто получить один из этих векторов истории пикселей, например,

pixel_history = squeeze(my_matrix(1,1,:));

squeeze удалит одноэлементное измерение из среза и превратит его в вектор 40 на 1 вместо матрицы 1 на 1 на 40.

Чтобы сделать измерение времени первым измерением матрицы, вы также можете permute матрицу,

permute(my_matrix, [3 2 1]);

Это поменяет 3-е и 1-е измерения, делая время 1-го измерения.

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