MATLAB: Несоответствие размерности назначения с индексом: y(:,:,j,i) = x;

Я пытаюсь удалить пустые (= 0) столбцы и строки из 2D-изображений в 3D-стеке изображений, а затем создать новый 3D-стек:

for i=1:numVols;

     for j=1:numFrames; % Crop black boundaries
        tempvol = VolStack(:,:,j,i);
        tempvol(:,all(tempvol==0,1))=[];
        tempvol(all(tempvol==0,2),:)=[];
                VolStackTemp(:,:,j,i) = tempvol;
     end

end

Странно то, что иногда это работает, но большую часть времени я получаю сообщение об ошибке из-за строки:

VolStackTemp(:,:,j,i) = tempvol;

Несоответствие параметров назначения в подписке

Есть идеи, почему?


person 2one    schedule 11.02.2015    source источник
comment
Это невозможно, потому что tepvol имеет разный размер на каждой итерации. Матрица всегда имеет одинаковый размер в каждом срезе.   -  person Daniel    schedule 11.02.2015
comment
Вам нужно будет сделать VolStackTemp клеточную матрицу   -  person Dan    schedule 11.02.2015
comment
Спасибо .. должен был понять это! Иногда для моих данных tempvol имеет одинаковый размер для всех 2D-изображений в 3D-стеке, но в других случаях он варьируется, как вы упомянули (например, для j = от 1 до 130 размер (tempvol) = 487 391, но затем для j = 131 размер (tempvol) = 486 391). Я думаю, что в качестве обходного пути для первого 2D-изображения стопки я обрежу, как указано выше, но затем использую те же 2D-размеры (первого 2D-изображения) для всех последующих 2D-изображений.   -  person 2one    schedule 11.02.2015


Ответы (1)


С дополнительным контентом из вашего комментария я бы решил это следующим образом:

%get all cols which are zero in all slices
h=all(all(VolStack==0,1),2)
cidx=all(h,3)
%same for rows
ridx=all(h,4)
%delete zero only rows and cols:
VolStack=VolStack(:,:,~ridx,~cidx)

Таким образом, ваш код будет работать быстрее, и никакие ненулевые данные не будут удалены.

person Daniel    schedule 11.02.2015