Я работаю над алгоритмом в Matlab, который требует регулярного обновления определенных элементов матрицы и поиска наилучшего для этого. Вот описание того, что я пытаюсь достичь:изменение некоторых элементов в 2D-массиве
- У меня есть массив MxN
A
и 1xN векторB
. - В принципе, вектор
B
является логическим индексом, который описывает, в каком столбцеA
, что мне нужно выбрать i.eC = A(:,B)
. - К сожалению, логический вектор
B
зависит от некоторых процессов. Это означает, что количество столбцов вC
не фиксировано. - Некоторые другие виды обработки используют
C
в качестве входов и производят еще один массивD
, который имеет такой же размер, какC
т.е.size(D) == size(C)
- Теперь, мне нужно «изменить»
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.
, который хорошо работает. я знал, что это должно быть что-то действительно простое, но я треснул/ударился головой, пытаясь понять это. большое спасибо. – ciklee
@ciklee, вам больше всего нравится. – Shai