Как обратиться ко всем граням куба (трехмерного массива) в Matlab?

Мне нужно присвоить граничные значения 3D-окну.

Предполагая, что у меня есть z = rand(L,M,N), есть ли лучший способ адресовать все грани этого ящика, чем обрабатывать все 6 граней по отдельности, z(:,:,1), z(:,:,end), z(:,1,:), z(:,end,:), z(1,:,:), z(end,:,:)?

Это то, что у меня есть прямо сейчас:

L=3;M=4;N=5;
z = rand(L,M,N);
bv = 0;
z([1,end],:,:) = bv;
z(:,[1,end],:) = bv;
z(:,:,[1,end]) = bv;

Я хотел бы иметь возможность сделать что-то вроде z(indices) = bv.


person Sparkler    schedule 09.11.2015    source источник
comment
Вам нужно обращаться к элементам в каком-то определенном порядке?   -  person Luis Mendo    schedule 10.11.2015
comment
@LuisMendo нет, это не имеет значения. Я просто хочу присвоить одинаковое значение всем граням, а может, и нескольким граням сразу.   -  person Sparkler    schedule 10.11.2015
comment
Возможно, связано: Рисование трехмерной модели куба RGB с помощью Matlab.   -  person horchler    schedule 10.11.2015
comment
Было бы полезно, если бы вы показали немного больше кода, чтобы дать представление о том, что вы пытаетесь сделать и как вы это делаете сейчас.   -  person horchler    schedule 10.11.2015
comment
Добавлен пример кода @horchler   -  person Sparkler    schedule 10.11.2015


Ответы (2)


Если у вас есть набор инструментов для обработки изображений, сработает использование padarray:

z = padarray(z(2:end-1,2:end-1,2:end-1), [1 1 1], bv);

Это просто берет внутренний блок куба и добавляет 1 копию bv со всех сторон.

person beaker    schedule 09.11.2015

Не уверен, что это лучше, чем ваш код, но вот оно:

%// Data
L = 3;
M = 4;
N = 5;
z = rand(L,M,N)
newValue = 0;

%// Let's go
indL = false(L, 1, 1);
indM = false(1, M, 1);
indN = false(1, 1, N);
indL([1 end]) = true;
indM([1 end]) = true;
indN([1 end]) = true;
ind = bsxfun(@or, bsxfun(@or, indL, indM), indN); %// linear index of all faces
z(ind) = newValue

До:

z(:,:,1) =
    0.2653    0.7302    0.1078    0.8178
    0.8244    0.3439    0.9063    0.2607
    0.9827    0.5841    0.8797    0.5944
z(:,:,2) =
    0.0225    0.1615    0.0942    0.6959
    0.4253    0.1788    0.5985    0.6999
    0.3127    0.4229    0.4709    0.6385
z(:,:,3) =
    0.0336    0.5309    0.8200    0.5313
    0.0688    0.6544    0.7184    0.3251
    0.3196    0.4076    0.9686    0.1056
z(:,:,4) =
    0.6110    0.0908    0.2810    0.4574
    0.7788    0.2665    0.4401    0.8754
    0.4235    0.1537    0.5271    0.5181
z(:,:,5) =
    0.9436    0.2407    0.6718    0.2548
    0.6377    0.6761    0.6951    0.2240
    0.9577    0.2891    0.0680    0.6678

После:

z(:,:,1) =
     0     0     0     0
     0     0     0     0
     0     0     0     0
z(:,:,2) =
         0         0         0         0
         0    0.1788    0.5985         0
         0         0         0         0
z(:,:,3) =
         0         0         0         0
         0    0.6544    0.7184         0
         0         0         0         0
z(:,:,4) =
         0         0         0         0
         0    0.2665    0.4401         0
         0         0         0         0
z(:,:,5) =
     0     0     0     0
     0     0     0     0
     0     0     0     0
person Luis Mendo    schedule 09.11.2015