如何在matlab中生成该矩阵
如何在matlab中生成该矩阵,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,H矩阵是n乘n,n=10000。我可以用loop在matlab中生成这个矩阵。我只是想知道是否有任何方法可以做到这一点而不在matlab中循环 您可以看到矩阵的右上部分由1/sqrt(n*(n-1))组成,对角线元素由-(n-1)/sqrt(n*(n-1))组成,第一列由1/sqrt(n)组成,其余元素为零 我们可以生成完整的矩阵,其中第一列包含所有1/sqrt(n),然后其余列包含1/sqrt(n*(n-1)),然后我们需要修改矩阵以包含所需的其余内容 因此,让我们集中讨论从第2行第2列开始的
H矩阵是n乘n,n=10000。我可以用loop在matlab中生成这个矩阵。我只是想知道是否有任何方法可以做到这一点而不在matlab中循环 您可以看到矩阵的右上部分由
1/sqrt(n*(n-1))
组成,对角线元素由-(n-1)/sqrt(n*(n-1))
组成,第一列由1/sqrt(n)
组成,其余元素为零
我们可以生成完整的矩阵,其中第一列包含所有1/sqrt(n)
,然后其余列包含1/sqrt(n*(n-1))
,然后我们需要修改矩阵以包含所需的其余内容
因此,让我们集中讨论从第2行第2列开始的元素,因为它们遵循一种模式。一旦我们完成了,我们就可以构建其他构建最终矩阵的东西
x = 2:n;
Hsmall = repmat([1./sqrt(x.*(x-1))], n-1, 1);
接下来,我们将讨论对角线元素:
Hsmall(logical(eye(n-1))) = -(x-1)./sqrt(x.*(x-1));
Hsmall(tril(logical(ones(n-1)),-1)) = 0;
现在,让我们将其余元素归零:
Hsmall(logical(eye(n-1))) = -(x-1)./sqrt(x.*(x-1));
Hsmall(tril(logical(ones(n-1)),-1)) = 0;
现在,我们已经完成了,让我们创建一个新的矩阵,将所有这一切结合在一起:
H = [1/sqrt(n) 1./sqrt(x.*(x-1)); repmat(1/sqrt(n), n-1, 1) Hsmall];
因此,完整代码为:
x = 2:n;
Hsmall = repmat([1./sqrt(x.*(x-1))], n-1, 1);
Hsmall(logical(eye(n-1))) = -(x-1)./sqrt(x.*(x-1));
Hsmall(tril(logical(ones(n-1)),-1)) = 0;
H = [1/sqrt(n) 1./sqrt(x.*(x-1)); repmat(1/sqrt(n), n-1, 1) Hsmall];
下面是一个n=6
的示例:
>> H
H =
Columns 1 through 3
0.408248290463863 0.707106781186547 0.408248290463863
0.408248290463863 -0.707106781186547 0.408248290463863
0.408248290463863 0 -0.816496580927726
0.408248290463863 0 0
0.408248290463863 0 0
0.408248290463863 0 0
Columns 4 through 6
0.288675134594813 0.223606797749979 0.182574185835055
0.288675134594813 0.223606797749979 0.182574185835055
0.288675134594813 0.223606797749979 0.182574185835055
-0.866025403784439 0.223606797749979 0.182574185835055
0 -0.894427190999916 0.182574185835055
0 0 -0.912870929175277
由于您使用的是相当大的
n
值10000
,因此您可能希望尽可能地压缩性能。
因此,您可以使用基于-
运行时测试 (一) 如果
n=10000
,则我端的运行时为-经过的时间为0.457543秒
(二) 现在,作为最后的性能压缩练习,您可以使用本文中列出的更快的预分配方案编辑out
的预分配步骤。因此,预分配步骤如下所示-
out(n,n) = 0;
使用此编辑代码的运行时为-运行时间为0.400399秒
(三)
n=10000
的运行时间为1.306339秒。@meng-很高兴我能帮上忙!这是一个有趣的问题。和往常一样,这是一个很好的解释!我自己也会选择triu+repmat,因此必须寻找其他方法:)让您始终快速地完成我的实现:)+1.@rayryeng虽然你的解释是最好的!!您在优化方面已经取得了长足的进步,特别是在bsxfun、unique、accumarray等方面!