考虑预先分配以下两个向量:
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
答案 0 :(得分:6)
在功能上没有区别。如果上下文意味着向量总是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
输出(在Windows 64位R2015b上测试,您的里程可能会有所不同!)
% f (full indexing): 2.4874 secs
% s (element indexing): 2.8456 secs
在增加n
时迭代此基准,我们可以生成以下图表以供参考。
答案 1 :(得分:4)
编程中的一般经验法则是#34;显式优于隐式"。由于两者之间没有功能差异,我说它取决于哪个更干净/更好的背景:
如果上下文使用了大量矩阵代数并且行和列向量之间的区别很重要,请使用2参数索引来减少错误并促进阅读
如果上下文在两者之间没有太大的区别,并且您只是使用向量作为简单数组,则使用单参数索引更清晰