考虑以下两个向量的预分配:
vecCol = NaN( 3, 1 );
vecRow = NaN( 1, 3 );
现在的目标是为这些向量赋值(例如,如果向量化不可能,则在循环中)。是否有关于索引的约定或最佳实践?
是否推荐以下方法?
for k = 1:3
vecCol( k, 1 ) = 1; % Row, Column
vecRow( 1, k ) = 2; % Row, Column
end
还是写成下面这样更好?
for k = 1:3
vecCol(k) = 1; % Element
vecRow(k) = 2; % Element
end
最佳答案
它在功能上没有区别。如果 context 表示向量始终是一维的(本例中的命名约定有帮助),那么您可以使用 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
输出(在 Windows 64 位 R2015b 上测试,您的里程可能会有所不同!)
% f (full indexing): 2.4874 secs % s (element indexing): 2.8456 secs
通过增加
n
迭代此基准,我们可以生成以下图表以供引用。
关于向量/一维数组的 MATLAB 索引约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45561220/