Сдвинуть матрицу изображения m * n на matlab вправо

В настоящее время у меня есть матрица изображений m * n из точек серой шкалы. Я хочу сместить изображение вправо на определенное количество пикселей. Следующий код, кажется, сдвигает его вправо и вверх. Как я могу это исправить? Мне нужно выполнить какую-то матричную операцию, чтобы сдвиг, поэтому встроенные функции не будут работать.

% Performs a shift on an input image matrix
function shift(CBout, matrix)    
    [m,n]=size(CBout);
    T=ones(m,n)*200;

    CBout = T+CBout;

    plot(CBout(1,:), CBout(2,:), 'k.');
    scale = 400;
    axis([-scale scale -scale scale])
end

Почему ты хочешь это сделать? Если Matlab не сможет оптимизировать ваш код, такой сдвиг будет означать выделение памяти для новых (и более крупных) данных и копирование старых данных в новые данные. Выделение памяти происходит медленно. Лучше просто изменить свою интерпретацию данных (в уме), ничего не делая с ней (с помощью компьютера). Я предполагаю, что ваша цель - продолжать добавлять к нему строку, и вы знаете окончательный размер массива. Если это так, лучше просто создать одну большую матрицу с окончательным размером, а затем заполнить строки этой большой матрицы.

R zu 26.10.2018 05:23

Вы рассматривали возможность использования circshift ?. В вашем случае это будет circshift(CBout, 200, 2), если я читаю то, что вы хотите сделать правильно.

rayryeng 26.10.2018 05:38

@rayryeng, это гораздо лучшее решение ... однако я делал это для класса линейной алгебры, который позволял мне выполнять только матричные операции с матрицей CBout

APorter1031 26.10.2018 15:29
0
3
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог понять это. Я просто создаю вектор единиц, а затем добавляю его в первую строку матрицы mxn.

% Performs a shift on an input image matrix
function shift(CBout, amount)
    disp('Shifting...');

    n = size(CBout, 2);
    T=ones(1,n)*amount;

    % Add shift amount to every element in the first row
    CBout = [CBout(1,:)+T; CBout(2,:)];

    plot(CBout(1,:), CBout(2,:), 'k.');
    scale = 400;
    axis([-scale scale -scale scale])
end

Обратите внимание, что вам не нужно создавать массив из них. Можно просто скалярно добавить amount. MATLAB достаточно умен, чтобы понять, что вы смещаете все значения в матрице на фиксированную величину.

rayryeng 26.10.2018 19:21

Другие вопросы по теме