Я хотел бы написать «синтаксический сахар» Octave или Matlab zero-padding, на которые пользователь отправляет n-мерный объект и вектор < = n записей. Вектор содержит новые, равные или большие размеры для объекта, а объект имеет нулевое значение для соответствия этим измерениям. Любые размеры, не указанные, остаются в силе. Один ожидается, использование, учитывая, например, 5d блок-Х 3d объемов медицинских изображений, можно назватьMatlab/Octave: как написать n-мерный алгоритм нулевого заполнения без eval
y = simplepad(X, [128 128 128]);
и, таким образом площадку первые три размеры по степени двух для вейвлет-анализа (на самом деле я использую отдельный function nextpwr2, чтобы найти эти размеры), оставив остальные.
Я ломал голову над тем, как написать этот метод, избегая страшного eval, но до сих пор не нашел пути. Может ли кто-нибудь предложить решение? Вот более или менее то, что у меня есть:
function y = simplepad(x, pad)
szx = size(x);
n_pad = numel(pad);
szy = [pad szx(n_pad+1:end)];
y = zeros(szy);
indices_string = '(';
for n = 1:numel(szx)
indices_string = [indices_string, '1:', num2str(szx(n))];
if n < numel(szx)
indices_string = [indices_string, ','];
else
indices_string = [indices_string, ')'];
end
end
command = ['y',indices_string,'=x;'];
eval(command);
end
Очень приятно. Мне пришлось перечитать это несколько раз. :) – beaker
да, последняя строка просто устанавливает последний элемент n-dim-массива в ноль. –
Одна маленькая проблема: если размеры уже равны «pad», вы замените существующее значение на ноль. – gnovice