【问题标题】:Create matrix: first n rows, 1st column has 1s and all other columns 0s, the next n rows, 2nd column has 1s and all other columns 0s and so forth创建矩阵:前 n 行,第 1 列有 1,所有其他列 0,接下来的 n 行,第 2 列有 1,所有其他列 0,依此类推
【发布时间】:2015-06-30 07:57:23
【问题描述】:

我想生成一个矩阵,其中在前 n 行中,第一列有 1,所有其他列都有 0。在接下来的 n 行中,第二列有 1,所有其他列都有 0,依此类推。例如,当 n=2 且列数为 3 时,矩阵将如下所示

A =

 1 0 0 
 1 0 0 
 0 1 0 
 0 1 0 
 0 0 1
 0 0 1

如果 m 是我使用的列数kron(eye(m),ones(n,1))。还有其他方法可以做到这一点吗?

【问题讨论】:

  • 你如何定义better
  • 你的方式有什么问题?
  • 我不认为有什么问题。我会换成其他方式。我的意图是最快的方式/使用最少的内存/是我的方式神方式。
  • 更快和更少的内存通常不是相互排斥的......

标签: matlab matrix


【解决方案1】:

我不知道“更好”是什么意思,但这里有一些 kron(eye(m),ones(n,1)) 的替代方案:

reshape(repmat(permute(eye(m),[3,2,1]),n,1),[],m)

reshape(bsxfun(@times,ones(n,1),permute(eye(m),[3,2,1])),[],m)

reshape(meshgrid(eye(m),ones(n,1)),[],m)

I = eye(m);
I(ceil((1:m*n)./n),:)

N = n*m;
z = zeros(N,m);
z(sub2ind([N,m],1:N,ceil((1:N)./n))) = 1

C = mat2cell(ones(n,m),n,ones(1,m));
blkdiag(C{:})

您可以使用timeit函数比较速度

【讨论】:

  • 有什么理由需要在第一个解决方案中使用permute?我对 permute 的理解是它改变了列的顺序,因此在这种情况下第三列将是第一列。在这里使用 permute 不只是将对角线的“斜率​​”从正变为负吗?当矩阵是 2D 时,为什么要使用 [3 2 1]?不要误会,但我只是想理解......
  • permute 不会重新排列列,它会切换维度(几乎就像转置的 n-d 模拟)。因此,在 2d 矩阵上使用 [3,2,1] 调用 permute 使其成为具有一行的 3d 矩阵
  • 我尝试了第一个解决方案,它适用于m=5,n=3,但不适用于m=5,n=2error: reshape: SIZE is not divisible by the product of known dimensions (= 3)。有没有办法让它适用于n=2
  • @kkuilla 是的,对不起,我在里面留下了 3,应该是 m。查看编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多