考虑以下两个向量的预分配:
vecCol = NaN( 3, 1 );
vecRow = NaN( 1, 3 );
Run Code Online (Sandbox Code Playgroud)
现在的目标是为这些向量分配值(例如,如果无法进行矢量化,则在循环内).是否有关于索引的约定或最佳实践?
是否建议采用以下方法?
for k = 1:3
vecCol( k, 1 ) = 1; % Row, Column
vecRow( 1, k ) = 2; % Row, Column
end
Run Code Online (Sandbox Code Playgroud)
或者编码如下更好?
for k = 1:3
vecCol(k) = 1; % Element
vecRow(k) = 2; % Element
end
Run Code Online (Sandbox Code Playgroud)
它在功能上没有区别.如果上下文意味着向量总是1D(在此示例中您的命名约定有帮助),那么您可以使用它vecCol(i)来简洁和灵活.但是,使用vecCol(i,1)语法有一些优点:
它似乎稍微快一些.这在小阵列上可以忽略不计,但是对于具有10^8元素的向量,以及速度提高> 10%,请参见以下基准.
function benchie()
% Benchmark. Set up large row/column vectors, time value assignment using timeit.
n = 1e8;
vecCol = NaN(n, 1); vecRow = NaN(1, n);
f = @()fullidx(vecCol, vecRow, n);
s = @()singleidx(vecCol, vecRow, n);
timeit(f)
timeit(s)
end
function fullidx(vecCol, vecRow, n)
% 2D indexing, copied from the example in question
for k = 1:n
vecCol(k, 1) = 1; % Row, Column
vecRow(1, k) = 2; % Row, Column
end
end
function singleidx(vecCol, vecRow, n)
% Element indexing, copied from the example in question
for k = 1:n
vecCol(k) = 1; % Element
vecRow(k) = 2; % Element
end
end
Run Code Online (Sandbox Code Playgroud)
输出(在Windows 64位R2015b上测试,您的里程可能会有所不同!)
% f (full indexing): 2.4874 secs
% s (element indexing): 2.8456 secs
Run Code Online (Sandbox Code Playgroud)
迭代此基准而不是增加n,我们可以生成以下图表以供参考.