【发布时间】:2015-11-12 16:29:01
【问题描述】:
我想创建一个矩阵M,索引为i,j,以便M(i,j)=i/j。我可以使用两个循环来做到这一点,但有什么方法可以在不使用 for 循环的情况下做到这一点?
【问题讨论】:
标签: matlab loops matrix vectorization
我想创建一个矩阵M,索引为i,j,以便M(i,j)=i/j。我可以使用两个循环来做到这一点,但有什么方法可以在不使用 for 循环的情况下做到这一点?
【问题讨论】:
标签: matlab loops matrix vectorization
创建两个索引向量。做一个垂直的,一个水平的。然后使用bsxfun() 进行元素划分。
i = (1:9)'; % '
j = 1:5;
M = bsxfun(@rdivide,i,j);
【讨论】:
你可以使用向量乘法,像这样:
row=1:10;
col=1:10;
M=row'*(1./col);
【讨论】:
bsxfun 或ndgrid 会比 Matlab 矩阵运算的经典强度要慢。你知道为什么我的解决方案是最慢的..?乘法中丢失了哪些信息?
ndgrid() 最慢。我们解决方案的差异可能是因为1./col 是一个已经在最后一位四舍五入的数值。此舍入误差将成倍增加,因此会出现在解决方案中。
matrix-mul 在尺寸减小时会发光。在这种情况下,我们有一个扩展。我最近做了一些基准比较 bsxfun(@times 和 matrix-mul 当两者都被输入一个列和一个行向量时,bsxfun 似乎占了上风。因此,似乎这种趋势也随着部门运营而延续。
5/3 == 5*(1/3) 返回 false,这就是为什么最好检查类似 a-b<e-15 的内容。
./ 表示法表示元素明智的操作。
[m,n]=ndgrid(1:9,1:5);
M = m./n;
(我不喜欢使用 i 和 j,因为你让引用 sqrt(-1) 变得复杂。)
【讨论】: