我想使用 d
作为输入并且不使用 if
语句来创建一个 d 维张量,如下所示:
if d == 2
B = zeros(r,r);
for i = 1:r
B(i,i) = 1;
end
elseif d == 3
B = zeros(r,r,r);
for i = 1:r
B(i,i,i) = 1;
end
end
有没有更高效的方法?
最佳答案
您可以使用 accumarray :
f = @(d,r)accumarray(repmat((1:r).',1 , d), 1);
> f(2,5)
=
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
这是 accumarray 的基本签名:
accumarray( subs , val )
使用 accumarray
我们可以创建一个 n 维数组,其中 subs
表示将填充到数组中的点的位置,val
代表了他们的值(value)。
如果 subs
作为矩阵提供,它的列数决定了结果数组的维数,每行代表每个点的位置。
例如对于 d = 2
和 r = 5
我们想创建一个 (5 x 5)
数组,其中有 1s以下位置:[1 1]、[2 2]、[3 3]、[4 4]、[5 5]
。
使用repmat
我们可以创建subs
:
subs = repmat ((1:5).' , 1, 2)
=
1 1
2 2
3 3
4 4
5 5
val
设置为 1
因此所有指定的位置都将由 1
填充。
关于matlab - 动态创建一个 d 维张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48251186/