您实际上不需要在此处进行任何逻辑索引,因为c > A | c < 1 排除的任何值都不会被mod 触及,并且将所有内容 传递给@ 可能会更快987654326@ 而不是通过比较和索引来确定要传递给mod 的值。
c = [17 -8 213, 7];
c = mod(c, A);
% 7 2 3 7
一般来说,对于需要对函数的输入和输出进行逻辑索引的其他函数,您需要将逻辑数组存储在临时变量中,而不是计算两次:
touse = c < 1 | c > A;
c(touse) = mod(c(touse), A);
这是一个快速的小基准,显示了每种方法的相对性能:
function timemod()
sizes = round(linspace(100, 100000, 10));
[times1, times2, times3] = deal(zeros(numel(sizes), 1));
A = 10;
for k = 1:numel(sizes)
data = round(rand(sizes(k), 1) * A * 100);
times1(k) = timeit(@()indexing(data, A));
data = round(rand(sizes(k), 1) * A * 100);
times2(k) = timeit(@()indexing_temp(data, A));
data = round(rand(sizes(k), 1) * A * 100);
times3(k) = timeit(@()mod(data, A));
end
figure
plot(sizes, 1000 * cat(2, times1, times2, times3))
legend({'Indexing', 'Indexing w/ temp', 'No Indexing'})
xlabel('Number of Elements')
ylabel('Execution Time (ms)')
fprintf('Indexing: %0.2f ms\n', mean(times1 * 1000))
fprintf('Indexing with temp: %0.2f ms\n', mean(times2 * 1000))
fprintf('No Indexing or temp: %0.2f ms\n', mean(times3 * 1000))
end
function data = indexing(data, A)
data(data > A | data < 1) = mod(data(data > A | data < 1), A);
end
function data = indexing_temp(data, A)
inds = data > A | data < 1;
data(inds) = mod(data(inds), A);
end