2013-05-21 2 views
0

Я работаю над алгоритмом в Matlab, который требует регулярного обновления определенных элементов матрицы и поиска наилучшего для этого. Вот описание того, что я пытаюсь достичь:изменение некоторых элементов в 2D-массиве

  1. У меня есть массив MxN A и 1xN вектор B.
  2. В принципе, вектор B является логическим индексом, который описывает, в каком столбце A, что мне нужно выбрать i.e C = A(:,B).
  3. К сожалению, логический вектор B зависит от некоторых процессов. Это означает, что количество столбцов в C не фиксировано.
  4. Некоторые другие виды обработки используют C в качестве входов и производят еще один массив D, который имеет такой же размер, как C т.е. size(D) == size(C)
  5. Теперь, мне нужно «изменить» D так, что он имеет такой же размер, как A. Трудная часть - это те столбцы в A, которые не были выбраны в # 2 выше, необходимо заменить на NaN s. Конечно, я могу сделать это грубым способом использования петель. Но я ищу это для Matlab-way, то есть линейного или логического индексирования, векторизации и т. Д. Здесь я застрял в данный момент.

Некоторые примеры, чтобы сделать вещи яснее:

Позволяет сказать

A = [1 2 3; 4 5 6; 7 8 9] 
B = [1 0 1] 
C = A(:,B) = [1 3; 4 6; 7 9] 

После некоторой обработки, я получу D = [2 5; 6 7; 3 3]. Теперь мне нужно «переформатировать» D в том же размере, что и A, с заполнением NaN i.e. D = [2 NaN 5; 6 NaN 7; 3 NaN 3].

То, что я пытался до сих пор,

Atmp = NaN(size(A)); 
Btmp = find(repmat(B,[size(B,1),1])); 
Atmp(Btmp) = D(Btmp); %-> error because D is smaller than A. 

ответ

2

Как насчет

fullD = NaN(size(A)); 
fullD(:, B) = D; 
+0

, который хорошо работает. я знал, что это должно быть что-то действительно простое, но я треснул/ударился головой, пытаясь понять это. большое спасибо. – ciklee

+0

@ciklee, вам больше всего нравится. – Shai

Смежные вопросы