У меня есть два 3D-массива:
форма - это 240 x 121 x 10958 массив
площадь это 240 x 1 x 10958 массив
Значения массивов имеют тип double. Оба имеют NaN в качестве значений заполнения там, где нет соответствующих данных.
Для каждой [240 x 121] страницы массива shape есть несколько элементов, заполненных одним и тем же номером. Например, будет блок из 1, блок из 2 и т. Д. c. Для каждой соответствующей страницы массива area есть один столбец числовых c значений длиной 240 строк. Что мне нужно сделать, так это постепенно go через каждую страницу массива shape (перемещаясь по 3-й оси длиной 10958) и заменить каждый пронумерованный элемент на этой странице номером, который заполняет строку совпадающее число в массиве area .
Например, если я смотрю на shape(:,:,500)
, я хочу заменить все восьмерки на этой странице на area(8,1,500)
. Мне нужно сделать это для чисел от 1 до 20, и мне нужно сделать это для всех 10958 страниц массива.
Если я извлекаю одну страницу и заменяю только одно число, я могу заставить ее работать:
shapetest = shape(:,:,500);
shapetest(shapetest==8)=area(8,1,500);
Это именно то, что мне нужно для одной страницы и одного номера. Переход по номерам 1-20 с l oop не кажется проблемой, но я не могу найти векторизованный способ сделать это для всех страниц исходного 3D-массива. Фактически, я не мог даже заставить его работать для одной страницы, не извлекая эту страницу как отдельную матрицу, как я сделал выше. Я пробовал такие вещи, но безрезультатно:
shape(shape(:,:,500)==8)=area(8,1,500);
Если я не могу сделать это для одной страницы, я еще больше не понимаю, как сделать это для всех сразу. Но у меня нет опыта работы с MATLAB, и я думаю, что я просто игнорирую правильный синтаксис.
Вместо этого я использовал массив ячеек и следующие очень неэффективные вложенные циклы for:
MyCell=num2cell(shape,[2 1]);
shapetest3=reshape(MyCell,1,10958);
for w=1:numel(shapetest3)
test_result{1,w}=zeros(121,240)*NaN;
end
for k=1:10958
for i=1:29040 % 121 x 240
for n=1:20
if shapetest3{1,k}(i)==n
test_result{1,k}(i)=area(n,1,k);
end
end
end
end
Это выполняет свою работу, и я легко могу превратить его обратно в массив, но это очень медленно, и я уверен, что существует намного лучший способ векторизации. Буду признателен за любую помощь или советы. Заранее спасибо.