使用基于索引 oneliner 的值初始化二维数组
initialize 2-D array with values based on index oneliner
在 python 中可以像 [a+b for a in range(n) for b in range(n)]
那样进行列表推导。有没有办法在 MATLAB 中做到这一点?如果它是一维数组,我可以说 arrayfun(@(a)a,1:n)
,但我找不到一种简洁的适应性方式。
可能不是那么简洁的方式:
for ii=1:n
a(ii,:) = ii:n+ii-1;
end
bsxfun
确实可以胜任:
n = 5 ;
a = bsxfun( @(x,y) x+y-1 , (1:n), (1:n).')
a =
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
正如 Luis Mendo 正确地提醒我们的那样,bsxfun
使用内置函数会更快(列表在文档中),所以如果您可以使用简单的内置函数你应该这样做:
a = bsxfun( @plus , (1:n), (0:n-1).')
如果你的函数太复杂,那么就像上面的例子一样明确定义它。
另一种方法是使用 hankel
:
>> n = 5;
>> hankel(1:n, n:2*n-1)
ans =
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
在 python 中可以像 [a+b for a in range(n) for b in range(n)]
那样进行列表推导。有没有办法在 MATLAB 中做到这一点?如果它是一维数组,我可以说 arrayfun(@(a)a,1:n)
,但我找不到一种简洁的适应性方式。
可能不是那么简洁的方式:
for ii=1:n
a(ii,:) = ii:n+ii-1;
end
bsxfun
确实可以胜任:
n = 5 ;
a = bsxfun( @(x,y) x+y-1 , (1:n), (1:n).')
a =
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
正如 Luis Mendo 正确地提醒我们的那样,bsxfun
使用内置函数会更快(列表在文档中),所以如果您可以使用简单的内置函数你应该这样做:
a = bsxfun( @plus , (1:n), (0:n-1).')
如果你的函数太复杂,那么就像上面的例子一样明确定义它。
另一种方法是使用 hankel
:
>> n = 5;
>> hankel(1:n, n:2*n-1)
ans =
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9