Для циклов обычно намного медленнее, чем встроенные операции MATLAB. Лучшим вариантом является умножение только ненулевых элементов Z
с использованием следующего подхода:
result = zeros(256,256);
result(Z ~= 0) = H(Z ~= 0) .* Z(Z ~= 0);
Вы можете увидеть полный код ниже, запустить тест, чтобы убедиться, что он получил правильный ответ, и время код, чтобы увидеть, будет ли он быстрее.
% setup variables
H = rand(256,256);
Z = zeros(256,256);
for i = 1:8
Z((i-1)*32+1:i*32, i:8:256) = 1;
end
% run calcuations and check that they are equal
HZ1 = f1(H, Z);
HZ2 = f2(H, Z);
are_equal = all(all(HZ1 == HZ2));
% time both functions
timeit(@() f1(H,Z))
timeit(@() f2(H,Z))
function result = f1(H, Z)
result = H .* Z;
end
function result = f2(H, Z)
result = zeros(256,256);
result(Z ~= 0) = H(Z ~= 0) .* Z(Z ~= 0);
end
Результаты по времени:
f1 - 6.875835e-05 s
f2 - 0.0008205853 s
К сожалению, новый подход примерно в 12 раз медленнее, чем простое умножение матриц. Это связано с тем, что MATLAB сильно оптимизирован для умножения матриц, а умножение полных матриц H
и Z
обеспечивает непрерывную работу используемой памяти.